需要一个函数来转义 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
使用字符类,如下所示:
function escape_string( str ) {
gsub(/[\\.^$(){}\[\]|*+?]/, "\\\\&", str)
return str
}
&
是对匹配字符串的反向引用,\\\\
用于转义匹配。
我使用这个小 util 函数,它的转义远远超出了需要,但通过使用字符范围使生活变得更容易:
# Functions, listed alphabetically
1 function __(_) {
gsub("[!-/:-@[-\140{-~]", "[&]", _) # I use \140 cuz I dont like random
gsub(/\^|\\/, "\\\\&", _) # unpaired backticks dangling in my code
return _
}
[!]["][#][$][%][&]['][(][)][*][+][,][-][.][/]
0123456789 [:][;][<][=][>][?]
[@]ABCDEFGHIJKLMNOPQRSTUVWXYZ [[][\\][]][\^][_]
[`]abcdefghijklmnopqrstuvwxyz [{][|] [}] [~]
将它们全部放在单独的括号表达式内可以防止对相邻字符的任何意外解释。
我有一个更复杂的版本,也可以转义已识别的序列:
[\a][\b][\t][\n][\v][\14][\r]
我使用
代替\14
,这样\f
linter 就不会一直抱怨。gawk