替换某些正则表达式时sed行为异常

时间:2019-05-24 01:32:58

标签: linux shell sed

我正在尝试删除数字-但仅当数字紧跟句号时才删除。类似的替换似乎可以正常工作,但不能使用句点。

我尝试了以下在另一篇文章中作为解决方案提供的内容:

echo "fr.r1.1.0" | sed s/\.[0-9][0-9]*/\./g

我得到fr....。看来,即使我转义了句点,它也可以匹配任意字符,而不只是句点。

此表达式似乎适用于上一个示例:

echo "fr.r1.1.0" | sed s/[[:punct:]][0-9][0-9]*/\./g 

并给我fr.r1..,然后给我

echo "ge.s1_1.0" | sed s/[[:punct:]][0-9][0-9]*/\./g

我得到ge.s1..而不是ge.s1_1.

1 个答案:

答案 0 :(得分:1)

您必须将sed指令放在单引号之间,以避免shell解释某些特殊字符:

echo "fr.r1.1.0" | sed 's/\.[0-9][0-9]*/\./g'
fr.r1..

此外,您无需在替换部分(.)中转义,并且可以将[0-9][0-9]*简化为[0-9]\+并给出简化的命令:

echo "fr.r1.1.0" | sed 's/\.[0-9]\+/./g'
fr.r1..

最后但并非最不重要的,因为POSIX [:punct:]字符类定义为

  

标点符号(除字母和数字外的所有图形字符)   https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions

它还将包含下划线(以及许多其他内容),因此,如果您希望将匹配项限制为.,后跟数字,则需要显式使用点(转义或通过其ascii值)