İki desen arasında (ve dahil) çizgiler yazdırın


16

Hattın CKsonunda olan hatlardan açgözlülükle başlamak ve hat sonunda olduğunda açgözlülüğü durdurmak istiyorum D. Denedim grep "$CK" "$D" file..txtama işe yaramadı.

Giriş:

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

İstenen çıktı:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

Yanıtlar:


21

Sen veya kullanarak daha iyi

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

VEYA

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

Eğer ısrar ediyorsanız , işte bir GNU grep yolu

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

Buraya

-P perl-regexp'yi etkinleştirir

-zhat ayırıcıyı NUL olarak ayarlar. Bu, grep'i dosyanın tamamını tek bir satır olarak görmeye zorlar

-o sadece eşleşen baskılar

(?s)PCRE_DOTALL'ı etkinleştirir, bu nedenle .herhangi bir karakter veya yeni satır bulur

\N newline dışında herhangi bir şeyle eşleşir

.*?bulur. gereksiz modda

(?<=..) geriye dönük bir iddia

(?=..) ileriye dönük bir iddia


neden eğik çizgi eklenmedi? böyleawk '/\/CK/,/\/D/' input
— Rahul Patil

@RahulPatil, çünkü OP, 'satırın sonunda "CK" olan satırlardan selamlamaya başlayın ve satır "D" olduğunda
— selamlamayı bırakın

bana öyle geliyor ki, regex hakkında güçlü bir anlayışa sahipsin .. Bu seviyeyi anlamadım, bu yüzden PCRE grep'in sonuncusunu açıklayabilir misin
— Rahul Patil

@RahulPatil, bazı açıklamalar ekledi :-)
— iruvar

@RohitPatil, eşleşen seçimi dosyadan silmek istiyorum. bunu yapabilir miyim?
— Rana Khan

0

BSD kullanıyorsanız grep(perl regex parametresini desteklemiyorsa -P), işte geçici çözüm:

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

Bu, tüm satırları birleştirerek çalışır (yeni satırları _ karakterle ), tek satır desenini kontrol ederek ve satırları orijinal durumuna geri genişleterek çalışır.

GNU kullanıyorsanız grep, çok satırlı eşleşme elde edebilirsiniz grep, ancak başka bir cevapta belirtildiği gibi grep( -P) için perl-regexp kullanmanız gerekir . Yine de GNU'yu macOS'a kurabilir ve kullanabilirsiniz .grepbrew install grepggrep


Alternatif olarak pcregrep, çok çizgili desenleri ( -M) destekleyen kullanabilirsiniz .


exKomutu da kullanabilirsiniz , örneğin:

ex +"/aaa/;/cdn/p" -scq! file
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.