bash - 使用 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
细节:
- 操作系统:Debian GNU/Linux 10
- sed --version: sed (GNU sed) 4.7
解决方案
您正在为文件名参数提供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"