首页 > 解决方案 > 使用 sed 在多个文件中匹配后追加新行

问题描述

我正在写一个脚本

该脚本的一个目标是在匹配后使用foo递归地在多个文件中附加一个新的代码行。.yml

# Append new line after match in multiple files with sed
## sed -i -se "s/\foo/bar/g" *.yml
grep -rl foo * .| xargs sed -i -e "s/\foo/a bar/g" *.yml

希望在每次与foo匹配后,因为/a, bar会在所有.yml文件的新行中添加。

我得到了意想不到的Sed 输出: sed: can't read *.yml: No such file or directory

细节:

  1. 操作系统:Debian GNU/Linux 10
  2. sed --version: sed (GNU sed) 4.7

标签: bashsed

解决方案


您正在为文件名参数提供xargs. 你也不应该*.yml用作论据。shell 会将其扩展到.yml当前目录中的文件,如果没有,您将收到错误消息。

如果您只想grep -r检查.yml文件,请使用该--include选项。

grep -rl --include='*.yml' foo . | xargs sed -i -e "s/foo/a bar/g"

请注意,该s命令不用于在一行之后追加新行。它用于在同一行内进行替换。s/foo/ a bar/g将所有foo在线替换为a bar. 如果要追加,请摆脱该s命令。另外,您不要放在命令/g的末尾。a

grep -rl --include='*.yml' foo . | xargs sed -i -e "/foo/a bar"

请参阅如何在文件中的某个字符串之后插入文本?


推荐阅读