如何删除文本文件中的特定文本

时间:2017-07-11 12:44:33

标签: linux bash awk

我有一个文本文件:

192.168.47.100 computer
192.168.47.101 phone
192.168.47.1 computer3
192.168.47.50 computer2

我要删除192.168.47.1

我试过

while read line
do
    IPTemp="$line"
    ex -s +"g/$IPTemp/d" -cwq $1
done < IPLib.txt

但输出是:

192.168.47.50 computer 3

我尝试了sed 's/192.168.47.1//g',但输出又是:

00 computer
01 phone
computer3
192.168.47.50 computer2

我在谷歌搜索但是我找不到合适的。

3 个答案:

答案 0 :(得分:7)

问题是您的模式匹配数据中的3行。您需要以$结束它。此外,如果您使用sed替换(s/),则最终会出现空行。使用删除:

$ sed '/192\.168\.47\.1$/d' file
192.168.47.100
192.168.47.101
192.168.47.50

在awk中:

$ awk '!/192\.168\.47\.1$/' file
192.168.47.100
192.168.47.101
192.168.47.50

另一个在awk中,将整个第一列与字符串进行比较,而不是使用正则表达式(感谢@Kent指出):

$ awk '$1!="192.168.47.1"' file
192.168.47.100
192.168.47.101
192.168.47.50

并使用grep

$ grep -v 192\.168\.47\.1$ file
192.168.47.100
192.168.47.101
192.168.47.50

修改:显然您更改了数据。现在你需要用空格结束模式:

$ sed '/192\.168\.47\.1 /d' file2
192.168.47.100 computer
192.168.47.101 phone
192.168.47.50 computer2

并在awk中:

$ awk '!/192\.168\.47\.1 /' file2
192.168.47.100 computer
192.168.47.101 phone
192.168.47.50 computer2

grep

$ grep -v 192\.168\.47\.1\  file2
192.168.47.100 computer
192.168.47.101 phone
192.168.47.50 computer2

答案 1 :(得分:2)

你可以用sed做到。您只需要强制与<>完全匹配 所以:

sed 's/\<192\.168\.47\.1\>/d'

应该有效。

答案 2 :(得分:-1)

要删除该行并将输出打印到标准输出:

sed '/192.168.47.1/d' ./infile

直接修改文件(并创建备份):

sed -i.bak '/192.168.47.1/d' ./infile