web-dev-qa-db-ja.com

awkで「」を置き換える方法は?

たとえば、"を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で機能します。

3
Michael Durrant
echo 'duck " cat' | sed 's/"/quote/'

または、awkでは、subは正規表現を使用するため、通常の//形式でそのようにマークします。

echo 'duck " cat' | awk 'sub(/"/,"quote")'
3
thrig

8進数エスケープを使用できます。

awk 'sub("\42", "quote")' <<'eof'
a string with a " at some point
eof
0
Steven Penny

文字列を使用する場合は、引用符で囲む必要があります。これは、アルファベット文字で構成される文字列(文字列/ロープの例で示すように)だけでなく、二重引用符などのメタ文字の文字列にも当てはまります。つまり、sub (","quote")が機能しないのと同じ理由で、sub (q,"quote")は機能しません。

二重引用符が文字列ターミネータ内にあることを確認する必要があります。プログラムをawkに渡すためにシェルで文字列ターミネータとして一重引用符をすでに使用しているため、これは少し難しくなり、プログラムでの使用が難しくなります。この問題を回避するには、次の2つの方法があります。

  1. プログラムを文字列としてawkに渡すのではなく、ファイルに書き込んでから(たとえば、substitution.awkと呼びます)、-fを指定してawkを実行します。ファイルを指すパラメータ(つまり、awk -f substition.awk)。これにより、一重引用符が文字列ターミネータとして解放されるため、プログラムで使用できます。
  2. awkとシェルはどちらも、エスケープ文字として円記号(\)をサポートしています。これを使用して、シェルまたはawkに、次の文字を通常の方法で解釈してはならないが、通常の文字として処理する必要があることを伝えます。つまり、次のいずれかを実行できます。

    awk 'sub(\'"\',"quote")'
    

    またはこれ:

    awk 'sub("\"","quote")'
    

    最初の例では、シェルから2つの一重引用符をエスケープして、awkがそれらを認識できるようにします。 2番目の例では、awkから1つの二重引用符をエスケープして、二重引用符を含む文字列を作成します。

0
Wouter Verhelst
echo 'a string with a " at some point' | awk -v dq=\" '{sub(dq,"quote")}1'
0
llua