如何使用sed命令从文件中删除包含特定字符串的行

时间:2013-04-19 16:24:11

标签: regex linux shell sed

我有以下文件:

#!example
#!toto
example
#example
;example
toto
example

我想删除包含字符串"example"的行,但行以"#!"开头。

所以结果文件应该是:

#!example
#!toto
toto

如何仅使用sed命令执行此操作?

3 个答案:

答案 0 :(得分:4)

这一行怎么样:

 sed '/^#!/n;/example/d' file

使用示例文本进行测试:

kent$  cat file
#!example
#!toto
example
#example
;example
toto
example

kent$  sed '/^#!/n;/example/d' file
#!example
#!toto
toto

如果你愿意, awk 也可以这样做:

kent$  awk '/^#!/ || !/example/' file                                                                                                                 
#!example
#!toto
toto

修改

sed的:

  • 如果行匹配starting with #!,请停止处理,转到下一行(n
  • 如果上述检查失败(与#!不匹配),请检查是否包含example,如果是,d删除(不在输出中打印)

AWK

  • 打印所有行:
    • #!或(||)开头,不包含示例。

性能:

我无法说出来。因为要求很简单。您可以构建一个巨大的文件,并使用time自行比较。

答案 1 :(得分:2)

如果您只想保留以#!

开头的行
$ sed '/#!/!d' foo.sh
#!example
#!toto

答案 2 :(得分:2)

这可能适合你(GNU sed):

sed '/#!/b;/example/d' file

这将打印包含#!的所有行以及包含example的所有其他行。