2009-11-25 101 views
19

相当肯定我错过了一些明显的东西!使用不同的分隔符删除

$ 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

的可能的复制[使用斜线在sed替换(http://stackoverflow.com/questions/5864146 /使用-斜线合sed的替换) – tripleee 2015-12-17 12:28:00

回答

30

您使用的分隔符//不适用于d命令,它们用于寻址。我想你会将它们与s///命令中的斜线进行比较......但是,尽管它们都与正则表达式有关,但它们是不同的上下文。

(其中出现之前命令),该行的命令被应用到...(其出现命令后)的选项过滤器的地址被用于控制所施加的更换。

如果要使用不同的分隔符的地址的正则表达式,你需要用一个反斜杠开始地址:

$ sed '\:timebomb:d' test.txt 
    01 30 * * * /opt/reincarnate.sh >> reincarnation.log 

(要了解地址和选项之间的差异,考虑命令的输出:

$ sed '/timebomb/s/log/txt/' test.txt 

地址选择仅包含该正则表达式timebomb线(S),但选项告诉s命令来替换正则表达式logtxt。)

1

冒号在sed中有一个标签,所以你的sed程序看起来像是一对没有任何事情的标签。如果前面有s命令,解析器可以看到冒号作为分隔符,所以这是一种特殊情况。

0

使用GAWK

gawk '!/timebomb/' file > newfile 
0

,你可以只使用外壳,无需外部工具

while read -r line 
do 
    case "$line" in 
     *timebomb*) continue;; 
     *) echo "$line";; 
    esac   
done <"file"