使用sed在匹配'product'后第2行插入字符串报错求助
需求与解决方法
问题背景
原文件内容:
a1 a2 a3 product 2 b1 b2 b3 product 3 c1 c2 c3
需要实现:在匹配product的行之后第2行插入字符串1111111,结果输出到文件out,期望效果:
product 1 a1 a2 1111111 a3 product 2 b1 b2 1111111 b3 product 3 c1 c2 1111111 c3
尝试执行以下sed命令时出现报错:
sed '/product/{n;n;a \ 1111111'} file > out
报错信息:
sed: -e expression #1, char 0: unmatched `{'
报错原因
报错是因为shell解析命令时引号位置错误:闭合单引号放在了}前面,导致shell提前结束sed表达式的引号包裹,剩余的}无法被sed正确识别。
正确的sed命令
以下两种写法均可解决问题:
写法1:调整引号位置(兼容多数sed版本)
sed '/product/{n;n;a\ 1111111 }' file > out
也可以用分号分隔命令,避免换行:
sed '/product/{n;n;a\ 1111111;}' file > out
写法2:GNU sed简化写法(更简洁)
如果使用的是GNU sed(Linux系统默认版本),可省略a后面的反斜杠:
sed '/product/{n;n;a 1111111}' file > out
命令说明
/product/:匹配所有包含product关键字的行{n;n;}:连续执行两次n命令,依次读取并输出匹配行后的第1行、第2行a\ 1111111:在当前行之后插入指定字符串,前面的空格用于和原文件缩进格式保持一致
内容的提问来源于stack exchange,提问作者Grace
相关产品推荐
相关产品推荐

