たとえば、"
をWordquote
に変更する必要があります。
変更する
a string with a " at some point
に
a string with a quote at some point
私が試してみました:
$ echo 'a string with a " at some point' | awk 'sub(",quote)'
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1: ^ unterminated string
awk: cmd. line:1: sub(",quote)
awk: cmd. line:1: ^ syntax error
$
$ echo 'a string with a " at some point' | awk 'sub(\",quote)'
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: sub(\",quote)
awk: cmd. line:1: ^ syntax error
一方、
$ echo 'a string with a " at some point' |
awk 'sub("string","rope")'
=>
a rope with a " at some point
文字列ロープのWordで機能します。
echo 'duck " cat' | sed 's/"/quote/'
または、awk
では、sub
は正規表現を使用するため、通常の//
形式でそのようにマークします。
echo 'duck " cat' | awk 'sub(/"/,"quote")'
8進数エスケープを使用できます。
awk 'sub("\42", "quote")' <<'eof'
a string with a " at some point
eof
文字列を使用する場合は、引用符で囲む必要があります。これは、アルファベット文字で構成される文字列(文字列/ロープの例で示すように)だけでなく、二重引用符などのメタ文字の文字列にも当てはまります。つまり、sub (","quote")
が機能しないのと同じ理由で、sub (q,"quote")
は機能しません。
二重引用符が文字列ターミネータ内にあることを確認する必要があります。プログラムをawk
に渡すためにシェルで文字列ターミネータとして一重引用符をすでに使用しているため、これは少し難しくなり、プログラムでの使用が難しくなります。この問題を回避するには、次の2つの方法があります。
awk
に渡すのではなく、ファイルに書き込んでから(たとえば、substitution.awk
と呼びます)、-f
を指定してawk
を実行します。ファイルを指すパラメータ(つまり、awk -f substition.awk
)。これにより、一重引用符が文字列ターミネータとして解放されるため、プログラムで使用できます。awk
とシェルはどちらも、エスケープ文字として円記号(\
)をサポートしています。これを使用して、シェルまたはawk
に、次の文字を通常の方法で解釈してはならないが、通常の文字として処理する必要があることを伝えます。つまり、次のいずれかを実行できます。
awk 'sub(\'"\',"quote")'
またはこれ:
awk 'sub("\"","quote")'
最初の例では、シェルから2つの一重引用符をエスケープして、awk
がそれらを認識できるようにします。 2番目の例では、awk
から1つの二重引用符をエスケープして、二重引用符を含む文字列を作成します。
echo 'a string with a " at some point' | awk -v dq=\" '{sub(dq,"quote")}1'