我有一个文本文件:
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
我在谷歌搜索但是我找不到合适的。
答案 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