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

(GNU awk)が理解できる正規表現でなければ$1なりません。awk

pat正規表現で指定されたパラメータにはgsub()効果match()がありません。操作する方法を知りたいです。ありがとうございます。

答え1

変数を渡す限り、あなたのやり方は正しいです。式が機能するには、次のものが必要です。二重バックスラッシュ少なくともガウクでは:

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}) }

関連情報