使用Sed的不同分隔符删除

时间:2009-11-25 15:57:49

标签: sed

相当肯定我错过了一些明显的东西!

$ 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命令不支持一组不同的分隔符吗?

4 个答案:

答案 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"