Роздрукуйте лінії між (включаючи) два візерунки


16

Я хочу розпочати прив'язку з рядків, які є CKв кінці рядка, і припинити приспівування, коли лінія має Dв кінці. Я спробував grep "$CK" "$D" file..txt, але не вийшло.

Вхід:

kkkkkkkkkkk   
jjjjjjjjjjjjjjjjjj  
gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D  
GGGGGGGGGGGGGG  
GGGGGGGGGGGGGG

Бажаний вихід:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

Відповіді:


21

Вам краще використовувати або

awk '/CK$/,/D$/' file.txt

АБО

sed -n '/CK$/,/D$/p' file.txt

Якщо ви наполягаєте на , ось спосіб GNU grep

grep -oPz '(?s)(?<=\n)\N+CK\n.*?D(?=\n)' file.txt

Ось

-P активує perl-regexp

-zвстановлює роздільник рядків на NUL. Це змушує греп бачити весь файл як один єдиний рядок

-o друкує лише відповідність

(?s)активує PCRE_DOTALL, тому .знаходить будь-який символ або новий рядок

\N відповідає нічого, крім нової лінії

.*?знахідки. в режимі безштурхності

(?<=..) - це заперечення твердження

(?=..) - це твердження вперед


чому не додано косу рису? як цеawk '/\/CK/,/\/D/' input
Рахул Патіл

@RahulPatil, це тому, що ОП заявило: "почніть прив'язування з рядків, у яких" CK "в кінці рядка, і припиніть прив'язку, коли у рядку" D "'
iruvar

мені здається, ви добре розумієте регекс .. Я не розумів цього рівня, тому можете пояснити, будь ласка, останній з PCRE grep
Рахул Патіл

@RahulPatil, додав пояснення :-)
iruvar

@RohitPatil, я хочу видалити відповідний вибір з файлу. чи можу я це зробити?
Рана Хан

0

Якщо ви використовуєте BSD grep(не підтримує паралельний параметр perge regex -P), ось такий спосіб вирішення:

grep -o "aaa.*cdn" <(paste -sd_ file) | tr '_' '\n'

Це працює, об'єднуючи всі рядки (замінюючи нові рядки _символом), перевіряючи однолінійний малюнок і розширюючи рядки до початкового стану.

Якщо ви використовуєте GNU grep, ви можете домогтися багаторівневої відповідності grep, але вам потрібно використовувати perl-regexp для grep( -P), як зазначено в іншій відповіді . Ви все ще можете встановити GNU grepна macOS через brew install grepта використовувати ggrepзамість цього.


Крім того, ви можете використовувати, pcregrepякі підтримують багатолінійні візерунки ( -M).


Ви також можете використовувати exкоманду, наприклад:

ex +"/aaa/;/cdn/p" -scq! file
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.