sed从行中删除所有开始的模式匹配


11

我有以下几行:

abababtestab

我正在尝试找出一个sed表达式,以ab从该行的开头删除所有出现的内容,因此转换后的行应为:

testab

我觉得这应该很简单,但是我真的一无所知sed

到目前为止,我有:

sed 's/^ab//'

但这仅会删除ab的首次出现。

Answers:


16
sed 's/^\(ab\)*//' <in >out

您应该将其分组。

echo ababababtestab |
sed 's/^\(ab\)*//'

testab

不过,某些较旧的seds可能处理得不太好。尽管子表达式复制是BRE 的POSIX特定的功能,但有些sed人不能正确地支持它。不过,在某些情况下...

echo abababtestab |
sed 's/^\(ab\)\1*//'

...可以代替。


正是我想要的东西!(一旦允许我将其标记为答案)

即使sed是大约1979年的第7版也支持它。不处理分组将是次等的模仿。
Jonathan Leffler

@JonathanLeffler-参见POSIX 正则表达式基本原理,部分是我基于该语句的基础。也许这只是一个假设,但是这里有一段... 标准开发人员认为,它具有共同的历史行为\n*,但并不支持\n\{min,max\}\(...\)*\(...\)\{min,max\},这是特定实现的非故意结果,并且它们支持子表达式和反向引用之后的重复表达式和区间表达式。
mikeserv

@JonathanLeffler:它也无法与传家宝工具箱中的sed版本一起使用。
cuonglm

@cuonglm- \(ab\)\1*版本可以使用默认的传家宝sed\(ab\)*版本可以使用SuSv4传家宝sed。至少对我的构建有用。诚然,我针对musl lib C构建了传家宝集,所以我可以想象这可能导致它的行为有所不同。但是通常,当某个特定功能在传家宝SuSv4传家宝工具中可用但在默认工具中不起作用时,这是因为开发人员做到了。
mikeserv

6

另一个sed

sed -e ':1' -e 's/^ab//;t1'

在输入的每一行中,我们都设置了一个label :1,然后s在行ab的开头进行ubstitution 。如果substitution成功,则test命令分支到label 1,重做工作,直到ab行开头没有模式出现,我们就完成了。


我的想法完全正确。严格来说,您不需要测试:s/^ab//; t1足够了
glenn jackman 2015年

@glennjackman:当然可以。更新了!
cuonglm
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.