相当肯定我错过了一些明显的东西!
$ cat test.txt
00 30 * * * /opt/timebomb.sh >> timebomb.log
01 30 * * * /opt/reincarnate.sh >> reincarnation.log
$ sed ':timebomb:d' test.txt
00 30 * * * /opt/timebomb.sh >> timebomb.log
01 30 * * * /opt/reincarnate.sh >> reincarnation.log
,而
$ sed '/timebomb/d' test.txt
01 30 * * * /opt/reincarnate.sh >> reincarnation.log
为什么会这样? d
命令不支持一组不同的分隔符吗?
答案 0 :(得分:34)
您使用的分隔符//
不适用于d
命令,而是用于寻址。我认为你将它们与s///
命令中的斜杠进行比较......然而,尽管两者都与正则表达式有关,但它们是不同的上下文。
地址(在命令之前显示)过滤命令应用于哪一行...选项(在命令后出现)用于控制更换已应用。
如果要在地址中为正则表达式使用不同的分隔符,则需要使用反斜杠启动地址:
$ sed '\:timebomb:d' test.txt
01 30 * * * /opt/reincarnate.sh >> reincarnation.log
(要了解地址和选项之间的区别,请考虑命令的输出:
$ sed '/timebomb/s/log/txt/' test.txt
地址仅选择包含正则表达式timebomb
的行,但选项告诉s
命令将正则表达式log
替换为txt
。 )
答案 1 :(得分:1)
冒号位于sed中的标签之前,因此您的sed程序看起来像几个没有发生任何事情的标签。如果前面带有s命令,解析器可以将冒号视为分隔符,这是一个特例。
答案 2 :(得分:0)
使用gawk
gawk '!/timebomb/' file > newfile
答案 3 :(得分:0)
你可以使用shell,不需要外部工具
while read -r line
do
case "$line" in
*timebomb* ) continue;;
*) echo "$line";;
esac
done <"file"