2009-11-25 28 views
19

Khá chắc chắn tôi đang thiếu một cái gì đó hiển nhiên!Xóa bằng cách sử dụng một dấu phân tách khác nhau

$ 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 

trong khi

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

Tại sao nó như vậy? Không phải là một tập hợp dấu phân cách khác được hỗ trợ cho lệnh d?

+0

có thể trùng lặp của [Sử dụng dấu gạch chéo trong sed thay thế] (http://stackoverflow.com/questions/5864146/sử dụng-slashes-in-sed-thay thế) – tripleee

Trả lời

30

Dấu phân tách // mà bạn đang sử dụng không dành cho lệnh d, chúng dành cho địa chỉ. Tôi nghĩ rằng bạn đang so sánh chúng với các dấu gạch chéo trong lệnh s/// ... Tuy nhiên mặc dù cả hai đều liên quan đến các biểu thức chính quy, chúng là các ngữ cảnh khác nhau.

Địa chỉ (xuất hiện trước lệnh) bộ lọc mà dòng lệnh được áp dụng cho ... Các tùy chọn (trong đó xuất hiện sau lệnh) được sử dụng để kiểm soát việc thay đổi áp dụng.

Nếu bạn muốn sử dụng delimiters khác nhau cho một biểu thức chính quy trong địa chỉ, bạn cần phải bắt đầu địa chỉ với một dấu chéo ngược:

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

(Để hiểu sự khác biệt giữa các địa chỉ và các tùy chọn, xem xét đầu ra của lệnh:

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

địa chỉ chọn duy nhất dòng (s) có chứa các biểu thức chính quy timebomb, nhưng các tùy chọn cho lệnh s để thay thế biểu thức chính quy log với txt.)

1

Dấu hai chấm đặt trước nhãn trong sed, vì vậy chương trình sed của bạn trông giống như một vài nhãn không có gì xảy ra. Trình phân tích cú pháp có thể nhìn thấy dấu hai chấm dưới dạng dấu phân tách nếu trước bởi lệnh s, vì vậy đó là trường hợp đặc biệt.

0

sử dụng gawk

gawk '!/timebomb/' file > newfile 
0

bạn chỉ có thể sử dụng vỏ, không cần công cụ bên ngoài

while read -r line 
do 
    case "$line" in 
     *timebomb*) continue;; 
     *) echo "$line";; 
    esac   
done <"file" 
Các vấn đề liên quan