Bash - 在文件中查找关键字并删除其行

Rog*_*ger 10 bash grep replace sed command-line-interface

我想给一个关键字,找到这个关键字在文件中的行,并删除整行.

这是我得到的,但它不能正常工作:

KEYWORD='domain.com'
cat /etc/hosts | grep -v "$KEYWORD" > /etc/hosts
Run Code Online (Sandbox Code Playgroud)

UPDATE

这对我有用:

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
Run Code Online (Sandbox Code Playgroud)

以下是命令后的结果sed -i_bak -e '/domain\.com/d' /etc/hosts:

127.0.0.1       localhost       localhost.localdomain
Run Code Online (Sandbox Code Playgroud)

我试过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
Run Code Online (Sandbox Code Playgroud)

注意:

  • 我指望在删除域名之前总是有一个标签

  • 我正在自动逃避域名的点.

mik*_*iku 17

使用流编辑器,sed:

sed -i ".bak" '/culpa/d' test.txt
Run Code Online (Sandbox Code Playgroud)

以上将删除test.txt中包含culpa的行.它将创建原始备份(名为test.txt.bak)并将就地修改原始文件.

  • 我的测试不适用于-i和.bak之间的空间.但是,当我pu -i.bak它确实有效. (3认同)

sid*_*yll 6

将它传输到另一个文件,而不是你正在阅读的文件,并小心使用无用的文件cat.

grep -v "$KEYWORD" /etc/hosts > newfile
Run Code Online (Sandbox Code Playgroud)

除了关于sed的精细答案,你还可以使用Perl和一些改进的正则表达式来解决这个问题:

perl -pi.old -e 's/.*\sdomain\.com\s*\n//' file
Run Code Online (Sandbox Code Playgroud)

注意我正在考虑domain.com将被空格字符(制表符或空格等)隔离,并且除了新行之外,在它之后只会出现零或更多空格.与-ised 类似,
-i.old在perl中设置$^I变量,原始文件将接收更改,而副本将保留在旧名称下并.old附加.