Linux sed命令替换固定位置字符串

工作中经常有编辑超大的文本文件,有的达百兆有的几个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]等等效替换。

Linux sed命令替换固定位置字符串

 

解法二:sed 's/(^.{5})(.{2})/\1XX/' file1

说明:将前5位字符作为一组,后2位字符作为另一组,保留第一组不变,再添上XX,第二组直接丢掉(没有\2)。间接实现固定位置的替换。

这里利用了零宽断言和分组有时可以转换。

下图,虽然正则把12001AA都被匹配到了,但在sed替换命令中因为分为两组,只取第一组加上XX,丢弃第二组,所以最终结果也会只替换AA。

Linux sed命令替换固定位置字符串

 

注意:sed中使用正则时,转义字符的使用和正常使用正则一样。即只有把作为正则中的元符号作为普通符号使用时,才要转义,否则无需转义。

 

如果你有更好的解决方案或者发现文中有不足之处,欢迎留言评论。^_^

2021.07.09 

Russell

 

上一篇:华为云安装redis


下一篇:Linux练习题--打印文本第10行