Як надати шаблон для нового рядка в grep?


95

Як надати шаблон для нового рядка в grep? Новий рядок на початку, новий рядок в кінці. Не регулярний вираз. Щось на зразок \ n.


6
Не зрозуміло, чого ти хочеш. new line at the beginningє порожнім рядком і new line at endзастосовується до кожного рядка у файлі. Чи можете ви опублікувати приклад?
PP

2
Насправді ви можете просто використовувати $. Це дещо обмежено, але корисно в простих випадках.
Krzysztof Jabłoński

Відповіді:


84

grep візерунки узгоджуються з окремими рядками, тому немає можливості, щоб зразок відповідав новому рядку, знайденому у введенні.

Однак ви можете знайти такі порожні рядки:

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 

Принаймні, GNU grep має опцію -z, яка робить grep-лінії розриву нульовим символом. Однак, схоже, він не підтримує новий рядок або \ n за зразком, який відповідає новому рядку, див. Звіт про помилку .
jarno

1
@jarno Підтримує \ n у візерунках із прапором -P
rubystallion

92

спробуйте pcregrepзамість звичайного grep:

pcregrep -M "pattern1.*\n.*pattern2" filename

-Mопція дозволяє їй відповідати по декількох лініях, так що ви можете шукати для перенесення рядків , як \n.


22

Ви можете використовувати цей спосіб ...

grep -P '^\s$' file
  • -Pвикористовується для регулярних виразів Perl (розширення POSIX grep).
  • \sвідповідати пробілам символів; якщо слідує за ним *, він також відповідає порожньому рядку.
  • ^відповідає початку рядка. $відповідає кінці рядка.

2
-Pє розширенням GNU. Я чудово використовую його, коли ситуація вимагає цього (як правило, шукати / дивитися позаду), але POSIX grep може це зробити просто за допомогою [[:space:]].
jordanm

1
FWIW, grep-сторінки man-сторінок Solaris і BSD (не перевіряли інші) мають пункт для -P. GNU і так цілком стандартний. :)
K3 --- rnc

1
Зі сторінки керівництва: [-P] Ця опція не підтримується у FreeBSD.
Marián Černý

Також немає [-P] для MacOsX: grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e pattern] [-f file] [--binary-files = value] [--color [= when]] [--colour [= when]] [--context [= num]] [--label] [- buffed buffed] [--null] [pattern] [файл. ..]
Нікколо

@ Niccolò Ви захочете brew install grepотримати GNU grep, який перевершує кілька способів. apple.stackexchange.com/questions/193288/…
herdrick

19

Завдяки @jarno я знаю про опцію -z, і я з'ясував, що при використанні GNU grep з опцією -P можливий збір з\n . :)

Приклад:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

Відбитки bar


1
Чудово, зауважте, що у відповіді я не отримую сповіщення про "@jarno".
jarno 13.03.18

3
Це чудово! Щиро дякую за обмін!
Алісія Танг

6

Що стосується обхідного шляху (без використання непереносимого -P), ви можете тимчасово замінити символ нового рядка іншим і змінити його назад, наприклад:

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

В основному він шукає точну відповідність, _foo_де _означає \n(so __= \n\n). Вам не потрібно перекладати його назад tr '_' '\n', оскільки кожен зразок все одно буде надруковано в новому рядку, тому видалення _достатньо.


вибачте за незнання, але використання заміни процесу не є ще однією сумісною NON posix, отже, не портативною функцією? в оболонці posix я не міг зробити <(p paste -sd_ file )?
humanityANDpeace

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.