删除行不以#开头并匹配模式

时间:2014-12-03 04:58:01

标签: regex shell sed

我正在尝试删除不以#开头的行,并匹配文件

中的模式localhost
#   127.0.0.1       localhost
#   ::1             localhost

127.0.0.1       localhost           <---- line I want to delete
127.0.0.2       abcabc

我尝试过以下脚本,但不起作用。

sed -i "/^[^#](.*)localhost$/d" /etc/hosts

sed -i "/^([0-9]{1,3}\.){3}[0-9]{1,3}/d" /etc/hosts

如何删除该行?

3 个答案:

答案 0 :(得分:1)

默认sed将()作为文字字符,而不是捕获组。

sed -i "/^[^#].*localhost$/d" /etc/hosts

OR

sed -i "/^[^#].* \+localhost.*$/d" /etc/hosts

在字符串localhost之后可能会出现空格的可能性,所以我在上面的命令中在字符串.*旁边添加了localhost

示例:

$ cat file
#   127.0.0.1       localhost
#   ::1             localhost

127.0.0.1       localhost
127.0.0.2       abcabc
$ sed "/^[^#].*localhost$/d" file
#   127.0.0.1       localhost
#   ::1             localhost

127.0.0.2       abcabc

答案 1 :(得分:0)

"/^[^#]*localhost$/d"

您可以简单地将其用作sed的参数来删除所需的行。

答案 2 :(得分:0)

awk '/localhost/ && !/#/ {next} 1'

结果

#   127.0.0.1       localhost
#   ::1             localhost

127.0.0.2       abcabc