为何sed未执行指定正则表达式替换?技术求助
sed替换不生效的原因及解决办法
问题根源
sed默认使用基础正则表达式(BRE),你写的正则是扩展正则/PCRE风格的,导致sed无法识别匹配规则,所以替换没生效:
\d:sed的BRE不支持这个数字简写,必须用[0-9]或者[[:digit:]]来匹配数字()和{}:在BRE里这些是普通字符,要转义成\(、\)、\{、\}才能实现分组和重复次数匹配;或者给sed加-E选项启用扩展正则表达式(ERE),就不用转义这些符号了
修正后的可用命令
方式1:用基础正则(BRE),转义特殊字符
grep file.txt | sed 's/ id-\([0-9]\{5\}\)-\([0-9]\{5\}\)//g'
方式2:启用扩展正则(ERE),简化写法
grep file.txt | sed -E 's/ id-[0-9]{5}-[0-9]{5}//g'
(GNU sed也支持用-r替代-E,但-E是POSIX标准,兼容性更好)
更简化的写法:直接用sed处理文件
如果只是要移除目标内容,没必要先grep,直接让sed处理原文件即可:
sed -E 's/ id-[0-9]{5}-[0-9]{5}//g' file.txt
执行以上命令后,输出就会变成:
Nov-06-22 00:01:16 Nov-06-22 00:01:16
内容的提问来源于stack exchange,提问作者gr68
相关产品推荐
相关产品推荐

