Якщо бути точним
Some text
begin
Some text goes here.
end
Some more text
і я хочу витягти весь блок, який починається від "починати" до "кінця".
з awk ми можемо зробити так, як awk '/begin/,/end/' text
.
Як робити греп?
Якщо бути точним
Some text
begin
Some text goes here.
end
Some more text
і я хочу витягти весь блок, який починається від "починати" до "кінця".
з awk ми можемо зробити так, як awk '/begin/,/end/' text
.
Як робити греп?
Відповіді:
Оновлено 18 листопада 2016 року (оскільки поведінка grep змінена: grep з параметром -P тепер не підтримує ^
і $
закріплює [на Ubuntu 16.04 з ядром v: 4.4.0-21-generic]) ( неправильне (не) виправлення )
$ grep -Pzo "begin(.|\n)*\nend" file
begin
Some text goes here.
end
Примітка: для інших команд просто замініть якір '^' і '$' на якір нового рядка '\n'
______________________________
З командою grep:
grep -Pzo "^begin\$(.|\n)*^end$" file
Якщо ви не бажаєте включати шаблони "почати" і "закінчити" в результаті, використовуйте grep з підтримкою Lookbehind і Lookahead.
grep -Pzo "(?<=^begin$\n)(.|\n)*(?=\n^end$)" file
Також ви можете використовувати \K
сповіщення замість твердження Lookbehind.
grep -Pzo "^begin$\n\K(.|\n)*(?=\n^end$)" file
\K
варіант ігнорувати все перед узгодженням шаблону та ігнорувати сам шаблон.
\n
використовується для уникнення друку порожніх рядків з виводу.
Або як @AvinashRaj припускає, що тут є простий легкий греп:
grep -Pzo "(?s)^begin$.*?^end$" file
grep -Pzo "^begin\$[\s\S]*?^end$" file
(?s)
говорить grep, щоб дозволити крапці відповідати символам нового рядка.
[\s\S]
відповідає будь-якому символу, який є або пробілом, або непробілом.
А їх вихід без включення "start" і "end" такий:
grep -Pzo "^begin$\n\K[\s\S]*?(?=\n^end$)" file # or grep -Pzo "(?<=^begin$\n)[\s\S]*?(?=\n^end$)"
grep -Pzo "(?s)(?<=^begin$\n).*?(?=\n^end$)" file
дивіться повний тест всіх команд тут ( застаріле, як поведінка grep з параметром -P змінено )
^
вкажіть початок рядка і $
вкажіть кінець рядка. вони додаються до "початку" та "кінця", щоб їх відповідати, якщо вони опинилися в одній лінії.
У двох командах я втік, $
тому що він також використовує для "Заміна команди" ( $(command)
), що дозволяє вивести команду на заміну імені команди.
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
-z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII
NUL character) instead of a newline. Like the -Z or --null option, this option
can be used with commands like sort -z to process arbitrary file names.
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
не друкувати \n
символи, які існують у рядку, починаються.
grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
Переклад помилки виглядає приблизно так:grep: a not protected ^ or $ is not supported with -Pz
grep
схоже, змінилася.