Imprimer des lignes entre (et inclure) deux motifs

16

Je veux commencer la grepping à partir des lignes qui ont CKà la fin de la ligne et arrêter la grepping lorsque la ligne a Dà la fin. J'ai essayé grep "$CK" "$D" file..txt, mais ça n'a pas marché.

Contribution:

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

La sortie souhaitée:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D
Rana Khan
la source

Réponses:

21

Il vaut mieux utiliser ou

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

OU

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

Si vous insistez sur , voici une méthode GNU grep

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

Ici

-P active perl-regexp

-zdéfinit le séparateur de ligne sur NUL. Cela oblige grep à voir le fichier entier comme une seule ligne

-o imprime uniquement

(?s)active PCRE_DOTALL, donc .trouve n'importe quel caractère ou nouvelle ligne

\N correspond à tout sauf à la nouvelle ligne

.*?trouve. en mode non louche

(?<=..) est une assertion derrière

(?=..) est une affirmation prospective

iruvar
la source
pourquoi ne pas ajouter une barre oblique? comme çaawk '/\/CK/,/\/D/' input
Rahul Patil
@RahulPatil, c'est parce que l'OP a déclaré 'commencez à saluer à partir des lignes qui ont "CK" à la fin de la ligne et arrêtez à gratter quand la ligne a "D"'
iruvar
il me semble, vous avez une bonne compréhension de l'expression régulière .. Je ne comprenais pas ce niveau, alors pourriez-vous s'il vous plaît expliquer ce dernier de grep PCRE
Rahul Patil
@RahulPatil, a ajouté quelques explications :-)
iruvar
@RohitPatil, je souhaite supprimer la sélection correspondante du fichier. puis-je faire cela?
Rana Khan
0

Si vous utilisez BSD grep(ne prend pas en charge les paramètres perge regex -P), voici la solution:

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

Cela fonctionne en concaténant toutes les lignes (en remplaçant les nouvelles lignes par du _caractère), en vérifiant le motif d'une ligne et en développant les lignes à leur état d'origine.

Si vous utilisez GNU grep, vous pouvez obtenir une correspondance multiligne dans grep, mais vous devez utiliser perl-regexp pour grep( -P) comme mentionné dans une autre réponse . Vous pouvez toujours installer GNU grepsur macOS via brew install grepet utiliser à la ggrepplace.


Vous pouvez également utiliser pcregrepce qui prend en charge les modèles multi-lignes ( -M).


Vous pouvez également utiliser la excommande, par exemple:

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