2010-09-17 99 views
1

我想刪除一對「};」之間的所有文本「其中包含特定的關鍵字。 我要的是正則表達式,多行

輸入:

}; text text KEYWORD text text }; 

輸出:

}; }; 

推薦我一個簡單的正則表達式。我知道'sed'會被使用。

+1

http://en.wiktionary.org/wiki/please – 2010-09-17 08:37:33

+0

對不起,我不知道協議。我會記住現在開始 – sole007 2010-09-17 09:05:08

回答

2

這應該在大多數情況下工作:

sed '/};[^}]*};/{s/};[^}]*};/}; };/;b};/};/!b;:a;N;/\n[^}]*};/!ba;s/[^;]*\n.*\n[^}]*/ /' inputfile 

有可能會是一些角落情況下失敗。如果您希望結果在兩行上,請將結尾處的空格更改爲\n

實例:

}; test ;}變得}; };

};
test
};
變得}; };

abc };
test
}; def
變得abc }; }; def

abc }; 111
test1
test2
222 }; def
變得abc }; }; def

2
\};[^}]*KEYWORD[^}]*\}; 

如果在兩個分隔符之間沒有},將會工作。

所以:

sed 's/\};[^}]*KEYWORD[^}]*\};/}; };/g' file.in > file.out 
+0

,但這會匹配開始和結束標記以及對嗎? – Gopi 2010-09-17 08:40:16

+0

是的,他們被馬上取代。 sed沒有查看(GNU BRE引擎)。 – 2010-09-17 08:41:16

+0

只需匹配整個事物,然後將其替換爲文字「};};」 – colithium 2010-09-17 08:41:33

0

下面的正則表達式匹配,你要刪除的東西 -

(?<=\};).*?KEYWORD.*?(?=\};) 

編輯:使用sed由@Tim指出了sed的不支持該不會工作lookarounds。

+0

這不是查找關鍵字,並且不會在sed中工作(沒有查找)。 – 2010-09-17 08:39:43

+0

感謝@Tim將它引入我的注意事項。固定。是的,這是普通的正則表達式,我不確定sed的具體情況。 – Gopi 2010-09-17 08:42:51

0

可能的最簡單的方法:

cat file.in | sed "/KEYWORD/s/};[^}]*};/}; };/g" > file.out