[英]sed not working as expected, removing special character from middle of string
我有一个包含内容的文件“ 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'
cat test | sed 's/\\([:lower:]\\)\\!\\([:lower:]\\)/\\1\\2/g'
和alpha / alphanum但很奇怪,它仅适用于单词“ hel!lo”除此以外,我的结果是:
sa!ve
hello
te!st
te!ve
help!
please!
不知道为什么它对其他词不起作用。
问题是您使用的字符类不正确。 [:lower:]
是字符集的名称 ,因此实际上您会像[[:lower:]]
这样使用它。
因此,正确的sed表达式为:
cat test | sed 's/\([[:lower:]]\)\!\([[:lower:]]\)/\1\2/g'
哪个按预期工作。
这是我得到的输出:
save
hello
test
teve
help!
please!
因此,您可以将[:lower:]
视为az
简写 ,因此在动态创建字符时,该字符将成为[[:lower:]]
。 这是一个棘手的问题,很多人被前两次咬伤。
您正在使用字符类,因此[:lower:]
将放在方括号内的任何单个字符。 在您的输入中,只有l
(在字符类:lower:
)被匹配,以便被替换。
将其更改为字符范围[az]
以匹配该范围内的任何小写字母。
cat test | sed 's/\([a-z]\)\!\([a-z]\)/\1\2/g'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.