我想提供一个关键字,在文件中找到此关键字所在的行并删除整行。
这是我得到的,但它没有按预期工作:
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
请注意:
我指望在删除域名之前总有一个标签
我会自动转义域名的点。
答案 0 :(得分:15)
使用stream editor,sed:
sed -i ".bak" '/culpa/d' test.txt
以上内容将删除test.txt中包含 culpa 的行。它将创建原始备份(名为test.txt.bak),并将就地修改原始文件。
答案 1 :(得分:6)
将其传输到另一个文件,而不是您正在阅读的文件,并注意无用的cat
。
grep -v "$KEYWORD" /etc/hosts > newfile
除了有关sed的精细答案外,您还可以使用Perl和一些改进的正则表达式来解决这个问题:
perl -pi.old -e 's/.*\sdomain\.com\s*\n//' file
注意我正在考虑domain.com
将被空格字符(制表符或空格等)隔离,并且除了新行之外,其后只会出现零或更多空格。与sed中的-i
类似,
perl中的-i.old
设置$^I
变量,原始文件将收到更改,而副本将保留在旧名称下并附加.old
。
答案 2 :(得分:1)
如果您只想删除示例文件的最后一行
sed -i '/[[:space:]]\+domain\.com/d' test.txt