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
您需要额外的锚点。
行的开头和结尾(如果每个条目都在一行中)
sed -E 's/^[0-9]{3}-[0-9]{2}-[0-9]{4}$/ /g' file
或单词边界(空格-文本转换)(GNU sed):
sed -E 's/\<[0-9]{3}-[0-9]{2}-[0-9]{4}\>/ /g' file
或者捕获(并返回)一个选修的附加字符。但这要求所有匹配的字符串都被附加字符包围。
sed -E 's/([^0-9])[0-9]{3}-[0-9]{2}-[0-9]{4}([^0-9])/\1 \2/g' file
或者(不在 sed 中)使用允许向前查找和向后查找的 PCRE。
perl -pe '$_ =~ s/(?<!\d)\d{3}-\d{2}-\d{4}(?!\d)/ /g' file