2010-04-30 48 views
2

嗨我想要刪除一行使用sed,如果它匹配在同一行中的2個正則表達式。 EG行以/開頭,以* /(註釋)結束。以下腳本將完成大部分工作。 sed -e'/ ^/*/d'-e'/ */$/d'文件名稱 該腳本將刪除以*開頭並以* /結尾的所有行。我希望它只在符合兩個標準而不是一個標準時才刪除該行。SED:匹配在同一行上的2個模式

回答

2

嘗試

sed '/^\/\*.*\*\/$/ d' filename

這裏的關鍵是,你可以八九不離十將兩個正則表達式模式爲一體,通過簡單地將它們與.*,其中「任意數量的任何字符的」匹配連接。當然,這強制了兩者之間的順序。第一個模式^\/\*必須出現在第二個\*\/$之前,以便匹配此特定模式。

此外,由於*在正則表達式中有特殊含義,所以一定要逃離你的矩陣,就像你必須逃避你的斜線一樣。

0

這剔除了多行註釋以及

# cat file 
blah blah /* comment */ 
words1 
words2 
/* multiline 
    comments 
/* 
end 

$ awk -vRS='*/' '{ gsub(/\/\*.*/,""); }1' file 
blah blah 

words1 
words2 

可以在另一臺過濾器添加到sed 's|\/\/.*||'過濾掉//意見以及

0

爲了您的具體問題,你可以做一些事情沿着@echo推薦的路線。但是,如果您需要更通用的解決方案,例如,正則表達式匹配的解決方案不是錨定在行的一端或另一端,或者可能以行中的任一順序錨定,或者甚至可能重疊,您會像下面的sed腳本:

/regexp1/! b notboth 
/regexp2/! b notboth 
:both 
# sed commands if both patterns match 
n 
:notboth 
# sed commands if at least one pattern doesn't match 
n 

這使用sed的分支能力。如果模式匹配成功,則b命令會跳轉到指定的標籤,模式上的尾部!會反轉匹配的意義。所以,大致上,

把它放在一個文件中,比如foo.sed,並運行它作爲sed -f foo.sed