sed没有按预期工作,从字符串中间删除特殊字符

时间:2017-02-07 16:13:26

标签: regex bash sed

我有一个文件'test',内容为:

sa!ve
hel!lo
te!st
te!ve
help!
please!

我想删除两个小写字母之间的任何感叹号。所以结果应该是:

save
hello
test
teve
help!
please!

我已经尝试了cat test | sed 's/\([:lower:]\)\!\([:lower:]\)/\1\2/g'和alpha / alphanum,但很奇怪,它只适用于'hel!lo'这个词,而不是别的,我的结果是:

sa!ve
hello
te!st
te!ve
help!
please!

不确定为什么它不适用于其他词语。

2 个答案:

答案 0 :(得分:4)

问题是您是否错误地使用了字符类。 [:lower:] 是字符集的名称,因此您实际上就像[[:lower:]]一样使用它。

因此正确的sed表达式为:

cat test |  sed 's/\([[:lower:]]\)\!\([[:lower:]]\)/\1\2/g'

按预期工作。

这是我得到的输出:

save
hello
test
teve
help!
please!

因此,您可以将[:lower:]视为a-z速记,因此在动态创建角色时,这会变为[[:lower:]]。这是一个棘手的问题,很多人在前几次被咬了。

答案 1 :(得分:1)

您正在使用字符类,因此[:lower:]将是方括号内的任何单个字符。在您的输入中,只有l(字符类:lower:中存在)才会被匹配,以便它被替换。

将其更改为字符范围[a-z],以匹配范围内的任何小写字母。

cat test | sed 's/\([a-z]\)\!\([a-z]\)/\1\2/g'