linux - 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:]
字符类定义为
标点符号(除字母和数字外的所有图形字符) https://en.wikibooks.org/wiki/Regular_Expressions/POSIX_Basic_Regular_Expressions
它还将包括下划线(以及许多其他内容),因此,如果您想将匹配项限制为.
后跟数字,则需要显式使用点(转义或通过其 ascii 值)
推荐阅读
- java - 使用 RewardedAd 将用户名传递给另一个活动
- python - 将 QMessageBox 系统图标添加到 QDialog
- c++ - 如何在 C/C++ 中测量顺序内存读取速度
- python - 字符串索引超出范围且语法无效
- html - 使用 SVG 或 JPG/PNG 图像来提高页面性能是否更好?
- javascript - 将渲染道具反应到 UI 并映射所有道具
- here-api - 等值线上的范围行为
- python - Python SQLite搜索具有多个关键字的帖子标题
- flutter - 如何在 Flutter Web 中使用 Skia/CanvasKit?
- java - PostgreeSQL 函数如何向 Java 应用程序返回多列和多行?