2016-05-04 36 views
2

需要一個函數來在awk腳本中轉義包含正則表達式運算符的字符串。awk:函數從字符串中轉義正則表達式運算符

function escape_string(str) 
{ 
    gsub(/\\/, "\\\\", str); 
    gsub(/\./, "\\.", str); 
    gsub(/\^/, "\\^", str); 
    gsub(/\$/, "\\$", str); 
    gsub(/\*/, "\\*", str); 
    gsub(/\+/, "\\+", str); 
    gsub(/\?/, "\\?", str); 
    gsub(/\(/, "\\(", str); 
    gsub(/\)/, "\\)", str); 
    gsub(/\[/, "\\[", str); 
    gsub(/\]/, "\\]", str); 
    gsub(/\{/, "\\{", str); 
    gsub(/\}/, "\\}", str); 
    gsub(/\|/, "\\|", str); 

    return str; 
} 

更好的想法:

我碰到這個 '醜陋' 的解決方案來?

+1

是的,但爲什麼?當人們試圖逃避正則表達式元字符時,幾乎總是因爲他們真的**想用字符串而不是正則表達式做些事情,但不知道如何進行字符串操作,所以他們錯誤地試圖逃避所有的RE元字符,以便他們可以使用他們作爲正則表達式操作中的字符串(例如'match($ 0,regexp)'),而不是在字符串操作中使用它們(例如'index($ 0,string)')。 –

+0

@EdMorton是的,**幾乎**總是,並不總是。這裏的目的是處理包含兩列這樣的文本文件:http://pastebin.com/U9Sjq53W - 所以,我寫了下面的awk腳本:http://pastebin.com/AwHmHS74來處理這樣的文件。我正在尋找在T.M.A-1迎接時錄製的字符串 - http://pastebin.com/sMDQxfcE - 在這種情況下,簡單的字符串操作無法解決問題。 – Lacobus

回答

3

你可以只使用單一gsub使用字符類這樣的:

function escape_string(str) { 
    gsub(/[\\.^$(){}\[\]|*+?]/, "\\\\&", str) 
} 

&是向後引用匹配的字符串和\\\\是逃避比賽。

+2

我認爲你可以避免在字符類裏面'[''',如果你首先列出']',它不需要轉義:'gsub(/ [] [\\。^ $(){} | *這是否是更清晰的是一個單獨的討論 –

+0

是的我知道,通過將它們放在第一和第二位置,我們可以避免逃避,我只是避免它,因爲它似乎令人困惑,因爲它似乎是正在使用2個不同的字符類:) – anubhava