我想要一个 sed 命令来更改所有社会保障 # 序列中的所有数字(格式仅如下所示123-45-6789或这个123456789) 到 X 的。任何格式与提供的 2 个示例之一不完全相同的数字序列不应受到该sed
命令的影响。数字序列都在一个信息.txt文件。
信息.txt看起来大致是这样的:
id093: 888-88-8888
id094: 333-33-3333
id095: 123456789
id096: 987654321
This next number shouldn't be converted to X's 0123456789 nor this one 0987-65-4321
从查看此页面(http://www.computerhope.com/unix/used.htm)在“s 命令”下,我知道这是我需要使用的格式:
sed –i 's/regularexpression(s)/replacement/g' info.txt
我不确定如何格式化regular expression(s)
和replacement
部分,因此只有符合前面提到的两种格式的数字才会受到影响(同时保留连字符)。
答案1
由于您似乎已经在使用 GNU sed
(-i
扩展):
sed -ri ':1
s/(^|[^-0-9])[0-9]{3}-[0-9]{2}-[0-9]{4}([^-0-9]|$)/\1XXX-XX-XXXX\2/g
s/(^|[^-0-9])[0-9]{9}([^-0-9]|$)/\1XXXXXXXXX\2/g
t1' your-file
(使用 BSD sed
,替换-ri
为-Ei ''
)
即转换ddddddddd
和 ,ddd-dd-dddd
前提是它们前面或后面没有十进制数字或连字符。
和perl
(GNUsed
借用的-i
):
perl -pi -e 's{(?<![\d-])(\d{3}-\d\d-\d{4}|\d{9})(?![\d-])}{
$& =~ s/\d/X/gr}eg' your-file