我想在这里做的是找到包含特定行中特定字符串的任何文件,并删除所述行,而不仅仅是字符串。
我所拥有的是这样的:
find / -type f -name '*.foo' -exec sed '1/stringtodetect/d' {} \;
然而,这将删除第1行和字符串之间的所有内容。鉴于那个sed论点。 (sed '1,/stringtodetect/d' "$file")
假设我有一个.php文件,我正在寻找字符串'gotcha'。 我只想编辑文件,如果它在文件的FIRST行中有字符串,如下所示:
陷入困境。
如果我运行脚本,我希望同一文件的内容显示为:
任何提示?
答案 0 :(得分:2)
您正在使用以下范围地址执行删除命令:
1,/stringtodelete/
这意味着从1
行到第一次出现stringtodelete
的所有行。
此外,您不需要(也不应该!)迭代find
的结果。 find
具有-exec
选项。它为已找到的每个文件执行命令,并将文件名作为参数传递。
应该是:
find / -type f -name '*.foo' -exec sed '/stringtodetect/d' {} \;
首先测试命令。确定无误后,使用sed -i
修改文件。如果您想要备份,可以使用sed -i.backup
(例如)。要在确定可以再次使用find后删除备份:
find / -type -name '*.foo.backup' -delete
答案 1 :(得分:1)
你需要一个sed脚本,它会跳过你感兴趣的行数字,而且只有你感兴趣的行才会删除该行匹配的行。
sed -e1bt -eb -e:t -e/string/d < $file
-e1bt
=对于第1行,分支到标签“t”
-eb
=无条件地分支到脚本的末尾(此时它将打印该行)。
-e:t
=定义标签“t”
-e/string/d
=删除该行,如果它包含“string” - 只有在未采用脚本末尾的无条件分支时才会到达该指令,即如果行号分支被采用。
答案 2 :(得分:0)
它是否匹配字符串的部分。 如果你尝试完全匹配,它可能会有所帮助。 另外,删除开头的1或用0替换它,
sed '/<stringtodetect>/d' "$file";
答案 3 :(得分:0)
sed用于单个行上的简单替换,即全部。对于其他任何事情,只需使用awk来实现简单性,清晰度,稳健性,可移植性以及软件的所有其他理想属性:
awk '!(NR==1 && /stringtodetect/)' file
答案 4 :(得分:0)
你很亲密。我想你要找的是:sed '1{/gotcha/d;}'