如何使用 bash 变量作为 gsub() 和 match() 的正则表达式参数?

如何使用 bash 变量作为 gsub() 和 match() 的正则表达式参数?

我有一个脚本

#! /bin/bash
awk -v pat="$1" '{ if(match($0, pat)) {print $0} }' "$3"
awk -v pat="$1" -v rep="$2" '{gsub(pat, rep); print $0}' "$3"

我想像这样运行它

myscript '\.\.+' ' ' ./inputfile

其中$1应该是awk(GNU awk)可以理解的正则表达式。

指定pat为正则表达式作为gsub()和 的参数match()将不起作用。我想知道如何才能让它发挥作用?谢谢。

答案1

就传递变量而言,您的处理方式是正确的。要使表达式发挥作用,您需要双反斜杠,至少在 Gawk 中:

myscript '\\.\\.+' ' ' ./inputfile

请注意,您可以简化 AWK 部分:

#!/bin/bash
awk -v pat="$1" 'match($0, pat)' "$3"
awk -v pat="$1" -v rep="$2" '{gsub(pat, rep)} 1' "$3"

答案2

只是用不同的方法快速回答:用 Awk 编写的脚本:

#!/usr/bin/gawk -f
BEGIN { find=ARGV[1]; repl=ARGV[2]; delete ARGV[1]; delete ARGV[2]}
      { print gensub(find,repl,"g",$0) }

然后是通常的 Unix 过滤器行为:

$ chmod 755 myawkscript

$ ls |myawkscript '\w(.)' '{\1}'
{y}{w}{s}{r}{p}t

$ myawkscript '(\w+)' '{\1}' myawkscript 
#!/{usr}/{bin}/{gawk} -{f}
{BEGIN} { {find}={ARGV}[{1}]; {repl}={ARGV}[{2}]; ..... 
      { {print} {gensub}({find},{repl},"{g}",${0}) }

相关内容