打印两个图案之间(并包括两个图案)之间的线

打印两个图案之间(并包括两个图案)之间的线

CK我想从行尾的行开始 grep ,并D在行尾的行停止 grep 。我尝试过grep "$CK" "$D" file..txt,但没有成功。

输入:

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

所需的输出:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

答案1

你最好使用或者

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

或者

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

如果你坚持,这是 GNU grep 方式

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

这里

-P激活 perl-regexp

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

-o仅打印匹配的

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

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

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

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

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

答案2

如果您使用的是 BSD grep(不支持 perl regex param -P),则解决方法如下:

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

这是通过连接所有行(用字符替换新行_)、检查单行模式并将行扩展回其原始状态来实现的。

如果您使用的是 GNU grep,您可以在 中实现多行匹配grep,但是您需要使用 perl-regexp for grep( -P) 就像另一个中提到的那样回答。您仍然可以grep在 macOS 上通过安装 GNUbrew install grep并使用它ggrep


或者你可以使用pcregrep它支持多线模式(-M)。


您还可以使用ex命令,例如:

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

答案3

`awk '/CK$/{f=1}/D$/{f=0;print;exit}f' filename

gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D

答案4

使用 Perl(5):

perl -nE 'print $_ if /CK$/.../D$/;'

使用 Raku(以前称为 Perl_6):

raku -ne 'put $_ if /CK$/fff/D$/;'

上面的两行代码都使用了类似 sed 的“触发器”运算符。在 Perl5 中,类似 sed 的“触发器”拼写为...。在 Raku 中,类似 sed 的“触发器”被拼写为fff

输入示例:

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

示例输出(Perl5 或 Raku):

gggggggggggg/CK
JHGHHHHHHHH
HJKHKKLKLLL
JNBHBHJKJJLKKL
JLKKKLLKJLKJ/D

请注意,由于 Raku 使用.点来链接运算,因此以 ... 开头的 Raku 代码put $_可以写为$_.put... 。此外,如果方法链以.点开头,Raku 默认会在$_主题变量上调用该链。因此,上面给出的 Raku 代码可以缩短为$_.put... ,甚至可以进一步缩短为.put... 。

https://perldoc.perl.org/perlop
https://raku.org

相关内容