【发布时间】:2011-10-26 09:57:45
【问题描述】:
我想给出一个关键字,在文件中找到该关键字出现的那一行,然后擦除整行。
这是我得到的,但它不能正常工作:
KEYWORD='domain.com'
cat /etc/hosts | grep -v "$KEYWORD" > /etc/hosts
更新
这对我有用:
sed -i_bak -e '/domain\.com/d' /etc/hosts
但是,由于我有两行“domain.com”,有没有办法告诉 sed 只删除确切关键字“domain.com”出现的行
这是/etc/hosts的原始内容:
127.0.0.1 localhost localhost.localdomain
222.111.22.222 hvn.domain.com
222.111.22.222 domain.com
在命令sed -i_bak -e '/domain\.com/d' /etc/hosts 之后它是这样结束的:
127.0.0.1 localhost localhost.localdomain
我试过sed -i_bak -e '/\<namourphoto\.com\.br\>/d' ~/Desktop/hosts,但没用。
结论
这是我想出的代码(基于好人给我的帮助):
D=domain.com
DOMAIN=`echo "$D" | sed 's/\./\\\\./g'`
sed -i_bak -e "/[\t]$DOMAIN/d" /etc/hosts
注意:
我在计算要擦除的域之前总是有一个标签
我正在自动转义域名的点。
【问题讨论】:
-
另请注意,点在正则表达式中具有特殊含义,因此
domain.com也将匹配domainxcom.net。您应该转义点。 -
我必须在''之间转义点吗?
-
是的,你知道。试试
echo abc | grep 'a.c',输出将是abc。 -
我写了一个代码(上面)来自动转义点
-
在
[\t]部分添加一个空格,因为 /etc/hosts 是空格分隔的。
标签: bash sed grep command-line-interface replace