首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed和删除两种模式之间的字符串

sed和删除两种模式之间的字符串
EN

Unix & Linux用户
提问于 2017-01-11 20:38:53
回答 5查看 14.4K关注 0票数 5

在用sed移除两个模式之间的字符串时,我遇到了问题。我总是有最后一种模式-2:

test.txt:

代码语言:javascript
复制
PATTERN-1xxxxPATTERN-2aaa
PATTERN-1xxxxPATTERN-2fffPATTERN-1zzzzPATTERN-2gggPATTERN-1zzzzPATTERN-2
PATTERN-1xxxxPATTERN-2bbb

cmd

代码语言:javascript
复制
sed 's/PATTERN-1.*PATTERN-2//g' test.txt

以上结果是

代码语言:javascript
复制
aaa

bbb

但我想要

代码语言:javascript
复制
aaa
fffggg
bbb

是否有可能找到模式-2最接近模式-1?

EN

回答 5

Unix & Linux用户

发布于 2017-01-12 15:30:39

正如@steeldriver所指出的,如果您有非贪婪的regexp,这是很容易的。如果没有,您可以使用一个循环来完成它,如下所示:

代码语言:javascript
复制
sed ':a;s/PATTERN-2/\n/;s/PATTERN-1.*\n//;ta' test.txt

这是因为我们知道在任何行的中间没有换行符。它还将与任何行中没有出现的任何其他字符一起工作,例如§

票数 3
EN

Unix & Linux用户

发布于 2017-01-12 15:50:54

如果只想使用sed,请尝试如下所示

代码语言:javascript
复制
sed 's/PATTERN-1[^P]*PATTERN-2//g' test.txt
票数 1
EN

Unix & Linux用户

发布于 2018-02-12 16:40:26

在您的示例中,.*与您希望保留的内容相匹配。

您可以捕获这些内容并通过以下方法将其替换回来:

代码语言:javascript
复制
sed 's/PATTERN-1\(.*\)PATTERN-2/\1/g' test.txt

括号之间的所有内容都存储在第一个捕获缓冲区中,而\1则替换为该缓冲区的值。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/336677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档