假设web/
namedfoo.php
和bar.php
.第一行foo.php
是“sdajgeSTRINGdsad”,第十行bar.php
是“gdfhu98324STRING”。任务是首先找到这两个文件,然后删除 foo.php 的第 1 行和 bar.php 的第 10 行,因为指定的字符串是“STRING”。
答案1
sed
可以这样做:
sed -i.bak '/STRING/d' web/*
答案2
要查找包含字符串的文件,请使用grep
.如果您想查找哪些文件web/
及其所有子目录中包含 STRING:
grep -R“STRING”网络/
要编辑文件并删除包含字符串的行,有很多选项,但这里有两个常见选项。由于您想对整行进行操作,这非常简单:)
首先,您可以使用grep
参数-v
来反向搜索并隐藏输出中的匹配行而不是显示它们。对于您的第一个文件,我们使用sponge
。这将使我们能够读取您的文件,对其进行过滤,然后将其写回到同一个文件中,这一切都在一个动作中:
grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php
对于第二个示例,我们将使用 执行相同的操作grep
,但如果您没有,sponge
可以将其写入不同的文件,然后将该文件移回原始名称:
grep -v "gdfhu98324STRING" bar.php > bar.php.cleaned
mv bar.php{.cleaned,}
sed
第二种方法是与d
行删除命令一起使用。对于您的第一个示例,我们将使用就地文件编辑以及创建.bk
备份文件的选项:
sed -i.bk '/sdajgeSTRINGdsad/d' foo.php
通过自己复制文件,然后使用 sed 过滤备份并覆盖原始文件,可以完成几乎相同的事情:
cp bar.php bar.php.bk
sed '/gdfhu98324STRING/d' bar.php.bk > bar.php
现在将这两个任务结合起来!让我们创建一个函数,以便您可以使用不同的字符串重复执行此操作:
function nuke_string () {
string="$1"
path="$2"
grep -R -l "$string" "$path" | while IFS= read -r file; do
sed -i.bk "/$string/d" "$file"
done
}
创建该函数后,您可以像这样使用它:
nuke_string "STRING" web/
web/ 中包含 STRING 的任何文件都将删除这些行,并由原始版本制作备份副本。您可以在当前 shell 中创建这样的函数,也可以将其写入.bashrc
文件并使其始终可用。
答案3
grep -l
只需与 一起使用即可-R
!这是一个完整的单行:
grep -Rl "STRING" web/ | xargs sed -i "/STRING/d"
答案4
您可以在 Ex 模式下使用 Vim:
for k in web/*.php
do
ex -sc '/STRING/d|x' "$k"
done
d
删除x
保存并关闭