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
如果你坚持grep,这是 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
... 。