sed只有一行的字符串

时间:2016-01-14 21:44:57

标签: linux bash sed

我想在这里做的是找到包含特定行中特定字符串的任何文件,并删除所述行,而不仅仅是字符串。

我所拥有的是这样的:

find / -type f -name '*.foo' -exec sed '1/stringtodetect/d' {} \;

然而,这将删除第1行和字符串之间的所有内容。鉴于那个sed论点。 (sed '1,/stringtodetect/d' "$file")

假设我有一个.php文件,我正在寻找字符串'gotcha'。 我只想编辑文件,如果它在文件的FIRST行中有字符串,如下所示:

陷入困境。

  1. 疑难杂症
  2. 有用的文字
  3. 更多文字
  4. 别删除我
  5. 如果我运行脚本,我希望同一文件的内容显示为:

    1. 列表项
    2. 列表项
    3. 别删除我
    4. 任何提示?

5 个答案:

答案 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;}'