需要 SED 帮助来省略一些表达式

需要 SED 帮助来省略一些表达式
sed -E 's/([0-9]{3})-([0-9]{2})-([0-9]{4})/ /g' a.dat > b.dat

这是替换 111-11-1111为空格,但它也替换0111-11-1111为空格...但我希望它忽略0111-11-1111(基本上如果有4个数字字符而不是3个)

答案1

您需要额外的锚点。

  1. 行的开头和结尾(如果每个条目都在一行中)

    sed -E 's/^[0-9]{3}-[0-9]{2}-[0-9]{4}$/ /g' file
    
  2. 或单词边界(空格-文本转换)(GNU sed):

    sed -E 's/\<[0-9]{3}-[0-9]{2}-[0-9]{4}\>/ /g' file
    
  3. 或者捕获(并返回)一个选修的附加字符。但这要求所有匹配的字符串都被附加字符包围。

    sed -E 's/([^0-9])[0-9]{3}-[0-9]{2}-[0-9]{4}([^0-9])/\1 \2/g' file
    
  4. 或者(不在 sed 中)使用允许向前查找和向后查找的 PCRE。

    perl -pe '$_ =~ s/(?<!\d)\d{3}-\d{2}-\d{4}(?!\d)/ /g' file
    

相关内容