Как сопоставить все, начиная с последнего разделителя YAML и далее


3

Я обычно использую grepдля поиска шаблона в строке. Однако в этом конкретном случае я должен идентифицировать заголовок YAML, также он заканчивается тройной чертой.

Мой файл test.info имеет следующий контент

---
title: dont't know
draft: true
---
this is a test to add some extra content

Я хочу , чтобы следующий вывод, то есть все , от после в последней YAML разделителя до конца файла:

this is a test to add some extra content

Когда я вхожу в тире, bash возвращает следующую ошибку:

$ cat test.info | grep '---' -A1
grep: unrecognized option `---'

Я безуспешно пытался «сбежать» от черточек. Любая идея? Это для BSD grep. Меня смущает то, что я могу получить то, что хочу, если сделаю что-то вроде следующего.

$ cat test.info | grep 'this' -A1

Проблема в том, что я не знаю, какое первое слово.

Я могу выполнить поиск файла в соответствии с рекомендациями, но инструмент возвращает шаблон, а не все сразу после:

$ grep -m 1 -e '---' test.info 
---
$ grep -- --- test.info | tail -1
---

Ответы:


2

Как насчет этой команды?

tac file| awk '/---/ {exit} {print}'|tac

В OSX просто замените обе tacкоманды наtail -r

От человека так:

 tac - объединяет и печатает файлы в обратном порядке - в обратном порядке команды cat;)

Выход tac file:

next line
this is a test to add some extra content
---
draft: true
title: dont't know
---

Команда awk awk '/---/ {exit} {print}'печатает все строки, пока не будет найден первый соответствующий шаблон.

Выход:

next line
this is a test to add some extra content

затем tacснова запустите команду, чтобы вернуться к настройкам по умолчанию.

Выход:

this is a test to add some extra content
next line

похоже, это работает из моего теста с его файлом
test.info

мммм ... странно, почему у меня нет так в системе? Это команда по умолчанию?
Андреа Моро


1
Отлично. это работает.
Андреа Моро

1
$ line = $ (grep -n - --- test.info | tail -n 1 | cut -d: -f1); tail -n + $ (($ line + 1)) test.info 
это тест для добавления дополнительного контента

Необходимо добавить соответствующую проверку ошибок, как в if $line 'not numeric' ...

Первоначальная проблема связана с тем, что вам нужно сбежать -или сказать программе, что это не вариант:

$ grep -n - --- test.info
1: ---
4: ---

Большая часть (?) Программного обеспечения GNU имеет «-» в качестве опции; говорит прекратить анализ для получения дополнительных опций после этого момента.

Примечание.
$ grep --version
Должно указывать, является ли это утилита GNU grep или нет.

$ grep -h
или
$ grep --help
обычно говорит варианты, которые он понимает.


Это работает, проголосовал.
Slhck

Это командная работа ;-)
Ханну

на всякий случай, если у него есть проблема с тире (он использует bsd grep, так что кто знает), то для выхода из тире кажется, что использование hex для тире сработало для него, это работает с GNU grep и из того, что он сказал, похоже, работало в его Bsd grep тоже $ echo - | grep -P '\x2d' соответствует его черту.
Бароп

1

Использование awk:

awk 'END{print}' RS='---' file

RSопределяет в ---качестве разделителя записей и с END{print}мы только печатает последнюю запись.

Используя sed:

sed -r ':a;$!{N;ba};s:^(.*\n?)---::' file

0

Я вижу как минимум два разных способа сделать это. На самом деле вам нужно убежать от первого "-"

Используя опцию -e:

grep -e "---" test.info

Выход из первого "-" с обратной косой чертой:

grep "\---" test.info

Ни одна из работ.
Андреа Моро

Я добавил больше деталей, чтобы их было проще воспроизвести.
Андреа Моро

??? Извините, тогда для меня загадка. Я проверил перед публикацией: он работает здесь (GNU grep 2.12)
Zimmi

Я добавил несколько деталей выше в своем ответе с содержанием файла, на всякий случай.
Андреа Моро

0

Так что, не принимая кредиты, как я не хочу, я просто публикую решение, которое работало на моем Mac благодаря KasiyA

tail -r file| awk '/---/ {exit} {print}'| tail -r

-1

Обращаясь к одному аспекту вашего (теперь оригинального) вопроса.

(И ваши новые вопросы по-прежнему говорят о grep и -A1 и делают вид, что вы не можете найти способ указать 3 дефиса, и это просто неправильно, потому что в ваших комментариях вы показали, что можете).

[ваш оригинальный вопрос спрашивал, как показать результаты ОТ точки. когда на самом деле вы хотите ОТ ПОСЛЕ. В вашем новом вопросе все еще говорится «от», я обновил его до «от после»

Если похоже, что grep и -A1 - это не то, что вам нужно, хотя это все еще упоминается даже в вашем обновленном вопросе

Я не вижу смешных результатов. Возможно, вы можете вставить результаты, которые вы считаете смешными. [теперь у вас есть]

Если вы выполните grep pattern -A1, то он выдает шаблон, за которым следует следующая строка. И это сбрасывает --после каждого матча.

например

$ cat t3.info
,,,
qwerty
uiop
,,,




werwer
werwer
,,,,,
werwerwer
werwerwer
werwerwer
,,,,



$ cat t3.info | grep -P ',,,' -A1
,,,
qwerty
--
,,,

--
,,,,,
werwerwer
--
,,,,



$

Вы можете выполнить grep -P '(? = ---) ...' -A1 Еще одна вещь, которую вы можете попробовать, это grep -P '\ x2d {3}' -A1

И если ваш файл имеет ---

$ cat t3.info
---
qwerty
uiop
---




werwer
werwer
---
werwerwer
werwerwer
werwerwer
---

Конечно, это не работает

$ cat t3.info | grep -P '---' -A1 grep: нераспознанная опция '---' Использование: grep [ОПЦИЯ] ... ШАБЛОН [ФАЙЛ] ... Попробуйте 'grep --help' для получения дополнительной информации.

Но это работает

$ cat t3.info | grep -P '\---' -A1
---
qwerty
--
---

--
---
werwerwer
--
---

и это работает

$ cat t3.info | grep -P '(?=\x2d{3})...' -A1
---
qwerty
--
---

--
---
werwerwer
--
---

grep версия 2.16

$ grep --version
grep (GNU grep) 2.16

Если вы не хотите включать ваш шаблон, тогда какой бы вариант вы не использовали, он не будет -A1, и я не понимаю, почему у вас возникают проблемы с соответствием ---

Может случиться так, что для того, чтобы делать то, что вы хотите, с помощью grep или чего-то подобного grep, вам нужно сопоставить новую строку с регулярным выражением egeg в положительном lookbehind .. для --- \ n, но, очевидно, grep не может сопоставить новые строки, в этом случае вы можете повезет больше с pcregrep https://stackoverflow.com/questions/2686147/how-to-find-patterns-across-multiple-lines-using-grep или другим способом. Еще один вопрос, как вы можете сопоставить то, что следует на линии после паттерна.


Виноват. Я не упоминал, что я на OS X, и у меня есть версия grep - grep (BSD grep) 2.5.1-FreeBSD
Andrea Moro

@AndreaMoro вы можете вставить команду и результаты, которые вы получаете? и попробуйте альтернативные строки grep, которые я предложил, например, cat t3.info | grep -P '(?=\x2d{3})...' -A1 илиcat t3.info | grep -P '\x2d\x2d\x2d' -A1
barlop

параметр -P соответствует -e в версии BSD. Что касается вывода, то с регулярным выражением ничего не производит. второй просто не удаляет все до последнего - как и ожидалось. Вот и вывод--- title: dont't know -- --- this is a test to add some extra content
Андреа Моро

@AndreaMoro не так ясно в комментарии, так как новые строки не видны, и никто не может много отформатировать в комментарии. Можете ли вы вставить примеры (преобразованные в bsd как есть) в ваш вопрос с результатами.
Бароп

1
@AndreaMoro Это то, что вы хотели, чтобы ваш вопрос был, но это не то, что говорит ваш вопрос. Ваш вопрос говорит о grep, а ваш вопрос говорит о том, что конкретный разделитель / шаблон является проблемой, а ваш вопрос говорит -A1 (что на самом деле будет включать шаблон), а ваш вопрос говорит, что он не работает, и вы не можете избежать тире / дефиса . Я предлагаю вам опубликовать еще один вопрос, на этот раз не говоря ничего о grep и ничего о ---том, чтобы быть особой проблемой. И ваш вопрос может быть больше о: а) сопоставлении текста вне пары тегов. Или б) сопоставлении текста после второго появления шаблона.
Бароп
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.