我有一个文件'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!
不确定为什么它不适用于其他词语。
答案 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'