如何使用sed替换每行中的多个指定位置字符?
解决sed替换多行指定位置字符的问题
你之前的命令报错是因为sed正则中\{5,10,23\}的写法不符合语法——\{n,m\}是用来限定前序表达式重复n到m次的语法,不能用来罗列多个独立的目标位置。
要替换每行第5、10、23位的字符为分号,由于每次替换都是将单个字符替换为等长度的分号(字符串总长度不变),可以通过多次执行单个位置替换命令来实现:
直接在命令行执行
sed 's/^\(.\{4\}\)./\1;/; s/^\(.\{9\}\)./\1;/; s/^\(.\{22\}\)./\1;/' text.txt > textm.txt
- 每个
s命令对应一个目标位置:- 替换第5位:匹配行首前4个字符(
.\{4\}),将第5个字符替换为分号 - 替换第10位:匹配行首前9个字符(
.\{9\}),将第10个字符替换为分号 - 替换第23位:匹配行首前22个字符(
.\{22\}),将第23个字符替换为分号
- 替换第5位:匹配行首前4个字符(
- 多个命令用分号
;分隔,sed会按顺序依次执行
用sed脚本批量处理(适合位置较多的情况)
如果需要替换的位置很多,可以创建一个sed脚本文件(比如replace_pos.sed),内容如下:
s/^\(.\{4\}\)./\1;/ s/^\(.\{9\}\)./\1;/ s/^\(.\{22\}\)./\1;/
然后执行脚本:
sed -f replace_pos.sed text.txt > textm.txt
注意事项
- 如果某行长度小于目标位置(比如不足23个字符),对应的替换命令不会对该行生效,也不会抛出错误
- 确保使用的是GNU sed或兼容的版本,语法在主流sed实现中都通用
内容的提问来源于stack exchange,提问作者gyuunyuu
相关产品推荐
相关产品推荐

