在(包括)两个模式之间打印行


16

我想从行CK末的行开始grepping,而当行末的行停止grepping D。我尝试过grep "$CK" "$D" file..txt,但是没有用。

输入:

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

所需的输出:

gggggggggggg/CK  
JHGHHHHHHHH   
HJKHKKLKLLL   
JNBHBHJKJJLKKL  
JLKKKLLKJLKJ/D

Answers:


21

你最好使用

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 匹配除换行符以外的任何内容

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

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

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


为什么不加斜杠?像这样awk '/\/CK/,/\/D/' input
Rahul Patil

@RahulPatil,这是因为OP声明“从行末尾具有“ CK”的行开始grepping,并在行末具有“ D”的行停止
grepping

看来我,您对正则表达式有很深的了解。.我不了解该水平,所以请您解释一下PCRE grep的最后一点
Rahul Patil

@RahulPatil,添加了一些解释:-)
iruvar

@RohitPatil,我想从文件中删除匹配的选择。我能做到吗?
拉纳·汗

0

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

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

通过连接所有行(用_字符替换新行),检查单行模式并将行扩展回其原始状态来工作。

如果您使用的是GNU grep,则可以在中实现多行匹配grep,但是您需要对grep-P)使用perl-regexp,如另一个答案中所述。您仍然可以grep通过在MacOS上安装GNU brew install grepggrep改为使用。


或者,您可以使用pcregrep支持多行模式(-M)的代码。


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

ex +"/aaa/;/cdn/p" -scq! file
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.