Печать строк между (и включая) двумя рисунками

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 way

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

Вот

-P активирует perl-regexp

-zустанавливает разделитель строк в NUL. Это заставляет grep видеть весь файл одной строкой

-o печать только соответствует

(?s)активирует PCRE_DOTALL, поэтому .находит любой символ или символ новой строки

\N соответствует чему-либо, кроме новой строки

.*?находит. в несжатом режиме

(?<=..) это утверждение о прошлом

(?=..) это прогнозное утверждение

Iruvar
источник
почему не добавлен слеш? как этоawk '/\/CK/,/\/D/' input
Рахул Патил
@RahulPatil, это потому, что ОП заявил, что «начинайте срезать строки, которые имеют« CK »в конце строки, и прекращайте срывать строки, когда строка имеет« D »»
iruvar
мне кажется, у вас есть сильное понимание регулярных выражений. Я не понял этот уровень, поэтому не могли бы вы объяснить, что последний из PCRE grep
Рахул Патил
@RahulPatil, добавил некоторые пояснения :-)
iruvar
@ RohitPatil, я хочу удалить соответствующий выбор из файла. Я могу это сделать?
Рана Хан
0

Если вы используете BSD grep(не поддерживает Perl Regex Param -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
kenorb
источник