GNU/Linux >> Znalost Linux >  >> Linux

Tisknout čáry mezi (a včetně) dvěma vzory?

Chci začít grepovat z řádků, které mají CK na konci řádku a přestat grepovat, když má řádek D na konci. Zkusil jsem grep "$CK" "$D" file..txt , ale nefungovalo to.

Vstup:

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

Požadovaný výstup:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

Přijatá odpověď:

Je lepší použít awk nebo sed

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

NEBO

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

Pokud trváte na grep, zde je způsob GNU grep

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

Zde

-P aktivuje perl-regexp

-z nastaví oddělovač řádků na NUL. To nutí grep vidět celý soubor jako jeden řádek

-o vytiskne pouze odpovídající

(?s) aktivuje PCRE_DOTALL, takže . najde jakýkoli znak nebo nový řádek

N odpovídá čemukoli kromě nového řádku

.*? najde . v režimu nongreedy

(?<=..) je tvrzení o pohledu zezadu

(?=..) je dopředné tvrzení


Linux
  1. Tisknout čáry mezi (a vyjma) dvěma vzory?

  2. Jak vytisknout řádky číslo 15 a 25 z každých 50 řádků?

  3. Rozdíl mezi .exrc a .vimrc?

  1. Společné řádky mezi dvěma soubory?

  2. Extrahovat text mezi dva konkrétní řádky?

  3. Čtení Grepových vzorů ze souboru?

  1. rozdíl mezi souborem zařízení a ovladačem zařízení

  2. Najděte a nahraďte text v souboru mezi rozsahy řádků pomocí sed

  3. Změňte pořadí řádků v souboru