awk:从字符串中转义正则表达式运算符的函数

Lac*_*bus 4 regex bash awk gawk

需要一个函数来转义包含 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;
}
Run Code Online (Sandbox Code Playgroud)

有什么更好的想法吗?

anu*_*ava 5

您可以使用像这样gsub字符类来使用 single :

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

&是对匹配字符串的反向引用,\\\\用于转义匹配。

  • 我认为你可以避免在字符类中转义 `[`,如果你先列出 `]`,它也不需要转义:`gsub(/[][\\.^$(){}|*+ ?]/, ...`. 这是否真的更清楚是一个单独的讨论。 (3认同)