工作中经常有编辑超大的文本文件,有的达百兆有的几个G,notepad++打开不了或者即使打开批量编辑一下也相当耗时。
既然Linux那么快,可以用sed 命令s参数(substitute)进行替换。
问:如下文本,如何替换第6到第7位的字符为XX?即只替换AA,AB,12,*(
12001AA
12001AB
1200112
12001*(
答:
sed替换语法
sed 's/被匹配的字符/新字符' 文件路径
解决问题的关键在怎么用正则匹配到固定位置。
可参见下列链接正则匹配固定位置字符串
解法一:sed -r 's/(?<=^.{5}).{2}/XX/' file1
说明:将前5位字符作为一组零宽的正则,不作为最后匹配结果,只会匹配后2位字符并作为最后结果。
但是,很不幸的是此sed命令有一个问题,sed命令不支持零宽断言。其实sed还不支持基本的正则元字符,如\w, \b, \s, \d等,可以用[a-zA-Z0-9_],[0-9]等等效替换。
解法二:sed 's/(^.{5})(.{2})/\1XX/' file1
说明:将前5位字符作为一组,后2位字符作为另一组,保留第一组不变,再添上XX,第二组直接丢掉(没有\2)。间接实现固定位置的替换。
这里利用了零宽断言和分组有时可以转换。
下图,虽然正则把12001AA都被匹配到了,但在sed替换命令中因为分为两组,只取第一组加上XX,丢弃第二组,所以最终结果也会只替换AA。
注意:sed中使用正则时,转义字符的使用和正常使用正则一样。即只有把作为正则中的元符号作为普通符号使用时,才要转义,否则无需转义。
如果你有更好的解决方案或者发现文中有不足之处,欢迎留言评论。^_^
2021.07.09
Russell