我已经设法通过使用来 grep 关键字的出现
grep "KeyWord" . -r -n -i -I
但是,KeyWord 的出现次数太多。我只想删除所有包含该词的行。
我搜索了一下,sed 看起来是个实用工具。谁能告诉我哪个命令可以解决问题?
谢谢。
答案1
使用 GNU sed:
find . -type f -print0 | xargs -0 sed -i /KeyWord/d
使用 OSX sed:
find . -type f -print0 | xargs -0 sed -i '' /KeyWord/d
第一个命令find
找到所有标准文件(不是目录、管道等),并以分隔符打印它们\0
(因此文件名可以包含空格、换行符等)。
第二条命令xargs
读取的输出find
,根据分隔符(\0
因为-0
)获取列表,并sed -i [...]
使用列表中添加的参数进行调用(sed
如果有很多文件,则会被多次调用,因为每次调用中参数的最大长度是有限的)。
该sed
命令就地修改(-i
)。
至于/KeyWord/d
,它将删除包含正则表达式的行KeyWord
。
您应该学会sed
正确理解(简单但不寻常的)语法,并参考相应的手册页以获取有关此处涉及的工具的更多信息。
正如我喜欢推广的那样zsh
,解决方案及其扩展的 glob:
sed -i /KeyWord/d **/*(.)
答案2
你可以在 Ex 模式下使用 Vim:
find -type f -exec ex -sc g/KeyWord/d -cx {} ';'
g
全局搜索d
删除x
保存并关闭
答案3
我最初是用 来grep
查找文件,因此感觉稍微修改一下比切换到 更安全一些find
。
$ grep -l -r KeyWord * | xargs sed -i /KeyWord/d
grep -l
将打印文件名,sed -i
并将编辑它们。