Ubuntu下使用sed正则表达式删除含数字单词的问题求助
解决sed删除含数字单词的问题
我来帮你搞定这个sed正则的坑!先看看你原来的命令问题出在哪,再给你正确的解决方案。
你原来命令的几个错误
- 命令结构完全错了:
echo sed /\w.*[0-9]+.*\w/g text > text这是把字符串sed /\w.*[0-9]+.*\w/g text直接写到了text文件里,根本没让sed去处理文本内容。 - 正则表达式不兼容sed默认规则:sed默认用基础正则表达式(BRE),
\w和+在BRE里不生效——\w不是BRE的标准字符,+只是普通字符,不是“一个或多个”的量词。 - 没有定位单词边界:你的正则会跨单词匹配,没办法精准定位到“包含数字的整个单词”。
正确的解决方案
我们的目标是删除所有包含至少一个数字的完整单词,可以分两种方式实现,适配Ubuntu的GNU sed:
方式1:用扩展正则(ERE,更简洁)
加上-E选项启用扩展正则,这样量词+不需要转义,正则更易读:
# 处理示例输入 echo "asdkbasdnas jasndasn7bkjns 789 jksndkasnd 092 jkasdsa" | sed -E 's/\b[[:alnum:]]*[0-9][[:alnum:]]*\b//g; s/ +/ /g; s/^ //; s/ $//' # 处理text文件(原地修改) sed -i -E 's/\b[[:alnum:]]*[0-9][[:alnum:]]*\b//g; s/ +/ /g; s/^ //; s/ $//' text
方式2:用基础正则(BRE,不需要-E)
如果不想用扩展正则,把+转义成\+,同时替换\w为POSIX字符类:
echo "asdkbasdnas jasndasn7bkjns 789 jksndkasnd 092 jkasdsa" | sed 's/\b[[:alnum:]]*[0-9][[:alnum:]]*\b//g; s/ \+//g; s/^ //; s/ $//'
正则解释
\b:单词边界,确保我们匹配的是完整的单词,不会把单词的一部分删掉[[:alnum:]]*:匹配零个或多个字母/数字(因为单词可能以数字开头,比如789,或者以字母开头中间夹数字,比如jasndasn7bkjns)[0-9]:匹配至少一个数字——只要单词里有数字,就会被匹配并删除- 后面的
; s/ +/ /g; s/^ //; s/ $//是用来清理删除单词后留下的多余空格,确保输出格式干净
验证结果
运行上面的命令后,示例输入会输出你期望的结果:
asdkbasdnas jksndkasnd jkasdsa
内容的提问来源于stack exchange,提问作者user9610829
相关产品推荐
相关产品推荐

