在(包括)两个图案之间打印线条

Ran*_*han 23 grep sed awk text-processing

我想从行CK尾的行开始 grepping,并在行尾时停止 grepping D。我试过了grep "$CK" "$D" file..txt,但没有用。

输入:

kkkkkkkkkkk   
jjjjjjjjjjjjjjjjjj  
gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D  
GGGGGGGGGGGGGG  
GGGGGGGGGGGGGG
Run Code Online (Sandbox Code Playgroud)

所需的输出:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D
Run Code Online (Sandbox Code Playgroud)

iru*_*var 27

你最好使用

awk '/CK$/,/D$/' file.txt
Run Code Online (Sandbox Code Playgroud)

或者

sed -n '/CK$/,/D$/p' file.txt
Run Code Online (Sandbox Code Playgroud)

如果您坚持使用,这是一种 GNU grep 方式

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

这里

-P 激活 perl-regexp

-z将行分隔符设置为 NUL。这会强制 grep 将整个文件视为一行

-o 打印仅匹配

(?s)激活 PCRE_DOTALL,因此.找到任何字符或换行符

\N 匹配除换行符以外的任何内容

.*?发现 . 在非贪婪模式下

(?<=..) 是后视断言

(?=..) 是一个前瞻断言