如何使用GNU sed遍历指定行匹配?相关报错如何修复?
错误原因
执行代码抛出的sed: -e expression #1, char 45: unterminated address regex错误,由两个写法问题导致:
- sed表达式外层用了单引号,shell不会解析单引号内的变量,
${line}不会被替换为实际遍历的行号,反而被sed识别为不完整的正则规则 - 表达式里多余的反斜杠转义打乱了sed的地址语法,
$在sed地址规则中默认代表文件最后一行,额外加的转义符、花括号转义都不符合sed的语法要求,导致正则匹配无法闭合。
修复方案
方式1:修正原循环写法
把单引号换成双引号让shell正常展开行号变量,删掉多余的错误转义,同时给文件变量加双引号避免路径含空格时报错:
for line in $(seq 1 3 265); do sed -i "${line}s/foo/bar/" "$FILE" done
注意:如果是macOS系统自带的BSD sed,
-i参数需要指定备份后缀,不需要备份就传空字符串,把sed命令改成sed -i '' "${line}s/foo/bar/" "$FILE"即可。
方式2:原生sed语法实现(推荐,性能更高)
你要实现的是从第1行开始,每隔3行执行一次替换,sed原生支持起始行~步长的地址匹配规则,不需要写shell循环反复调用sed,单次执行就能完成全部操作:
sed -i '1~3s/foo/bar/' "$FILE"
这个写法会自动匹配第1、4、7……行,和你原来循环seq 1 3 265的逻辑完全一致,执行效率远高于循环写法。
内容的提问来源于stack exchange,提问作者Amir
相关产品推荐
相关产品推荐

