2009-11-25 131 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"