Linien zwischen zwei Mustern drucken (und diese einschließen)

16

Ich möchte mit dem Greifen an den Zeilen beginnen, die CKam Ende der Zeile stehen, und mit dem Greifen aufhören, wenn die Zeile Dam Ende steht. Ich habe es versucht grep "$CK" "$D" file..txt, aber es hat nicht funktioniert.

Eingang:

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

Die gewünschte Ausgabe:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D
Rana Khan
quelle

Antworten:

21

Du bist besser dran mit oder

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

ODER

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

Wenn Sie auf , ist hier ein GNU-grep-Weg

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

Hier

-P Aktiviert Perl-RegExp

-zSetzt das Zeilentrennzeichen auf NUL. Dies zwingt grep, die gesamte Datei als eine einzige Zeile zu sehen

-o druckt nur passend

(?s)Aktiviert PCRE_DOTALL, .findet also ein beliebiges Zeichen oder eine neue Zeile

\N passt zu allem außer newline

.*?findet. im unechten Modus

(?<=..) ist ein Blick hinter die Behauptung

(?=..) ist eine Vorausschau-Behauptung

iruvar
quelle
warum nicht Schrägstrich hinzugefügt? soawk '/\/CK/,/\/D/' input
Rahul Patil
@RahulPatil, das liegt daran, dass das OP angegeben hat: "Beginnen Sie mit dem Greifen von den Zeilen, die" CK "am Zeilenende haben, und hören Sie mit dem Greifen auf, wenn die Zeile" D "hat
iruvar
es scheint mir, Sie haben ein starkes Verständnis von Regex. Ich habe dieses Niveau nicht verstanden, also können Sie bitte das letzte von PCRE grep
Rahul Patil
@ RahulPatil, hinzugefügt einige Erklärung :-)
Iruvar
@RohitPatil, ich möchte die passende Auswahl aus der Datei löschen. kann ich das machen?
Rana Khan
0

Wenn Sie BSD verwenden grep(unterstützt Perl-Regex-Parameter nicht -P), ist hier die Problemumgehung:

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

Dies funktioniert, indem alle Zeilen verkettet werden (neue Zeilen werden durch _Zeichen ersetzt), das einzeilige Muster überprüft und die Zeilen wieder in ihren ursprünglichen Zustand zurückversetzt werden.

Wenn Sie GNU verwenden grep, können Sie eine mehrzeilige Übereinstimmung in erzielen grep, aber Sie müssen perl-regexp für grep( -P) verwenden, wie in einer anderen Antwort erwähnt . Sie können GNU weiterhin grepüber MacOS installieren brew install grepund ggrepstattdessen verwenden.


Alternativ können Sie verwenden, pcregrepwelches mehrzeilige Muster unterstützt ( -M).


Sie können auch einen exBefehl verwenden, zB:

ex +"/aaa/;/cdn/p" -scq! file
Kenorb
quelle