2016-05-04 30 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; 
} 

任意のより良いアイデアを?あなたはちょうどこのよう文字クラスを使用して単一のgsubを使用することができます

+1

はい、なぜですか?人々がregexpメタキャラクタをエスケープしようとすると、正規表現の代わりに文字列を使って何かをしたいのですが、文字列操作を行う方法がわからないため、すべてのREメタキャラクタをエスケープして使用できます。正規表現演算(例えば、 'match($ 0、regexp)')中の文字列として、それらを文字列演算(例えば 'index($ 0、string)')で使用する代わりに使用します。 –

+0

@EdMortonはい、**ほぼ常に、常にそうとは限りません。ここでの目的は、このような2つのカラムを含むテキストファイルを処理することです:http://pastebin.com/U9Sjq53W - このようなファイルを処理するには、次のawkスクリプトを書きました:http://pastebin.com/AwHmHS74私は文字列 'T.M.A-1が挨拶されたときに記録する ' - http://pastebin.com/sMDQxfcEを探しています - この場合、単純な文字列操作では問題を解決できません。 – Lacobus

答えて

3

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

&はマッチした文字列と\\\\への後方参照が試合を逃れるためです。

+2

文字クラスの中で '[' 'を避けることができ、'] 'を最初にリストすると、エスケープする必要はないと思います:' gsub(/ [] [\\。^ $(){} | * –

+0

はい、私はそれらを第1位と第2位に置くことで、エスケープを避けることができることを認識しています。 2つの異なる文字クラスが使用されています:) – anubhava

関連する問題