linux - sed 在替换某些正则表达式时行为不端

标签 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.

最佳答案

您必须将 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:] 字符类定义为

punctuation (all graphic characters except letters and digits) https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions

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

关于linux - sed 在替换某些正则表达式时行为不端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56284798/

相关文章:

Linux awk 字符串执行变量

linux - 基于两个条件的嵌套查找

linux - 从Linux中的数字获取上限整数(BASH)

windows - Vista 中的 sed - 如何删除之间的所有符号?

linux - Sed:从字符串中提取服务器名

sed 将模式移动到行首

linux - pthread_join() 是一个关键函数吗?

linux - 如何编写 bash 脚本以允许整个命令带有空格?

linux - 从服务器到另一个没有私钥密码的 SSH 连接

linux - 与脚本程序相关的 bash 脚本移植问题