如何在sed中匹配指定模式且排除特定字符串后追加行?
问题:用sed在指定行后添加内容
需求:在文件中以#开头、包含hello但不包含bye的行后添加一行new line。
输入文件内容:
# abc def hello # bye hello zzzz # abc def hello
期望输出:
# abc def hello new line # bye hello zzzz # abc def hello new line
现有命令:
sed -e '/^#.*hello.*/Ia\'\"new line\" $input_file
已知sed有排除模式(如/pattern/!),但不知道如何把/bye/!加入到现有命令中,请教调整方法。
解决方案
直接组合多个匹配条件就能实现,sed支持串联匹配规则,要同时满足「以#开头、含hello、不含bye」这三个要求,调整后的命令有两种写法:
写法一(逻辑清晰,推荐)
sed -e '/^#.*hello/ { /bye/!I a\'$'\nnew line' }' $input_file
- 先通过
/^#.*hello/筛选出以#开头且包含hello的行 - 再在这个范围内用
/bye/!排除掉包含bye的行,对剩下的行执行a命令插入new line I是忽略大小写匹配的标记,不需要大小写不敏感的话可以删掉$'\n'用来生成换行符,保证新行能正确插入到目标行后面
写法二(通过删除非目标行过滤)
sed -e '/^#.*hello/ !d; /bye/ !I a\'$'\nnew line' $input_file
/^#.*hello/ !d:先删掉所有不满足「以#开头+含hello」的行,只留下候选行- 再对候选行排除含bye的,然后添加新行
内容的提问来源于stack exchange,提问作者Mister Claret
相关产品推荐
相关产品推荐

