awkで「を変える方法は?

awkで「を変える方法は?

たとえば、aをin"ワードに変更する必要があります。quote

変化

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

ロープの言葉に適しています。

答え1

echo 'duck " cat' | sed 's/"/quote/'

または で正規表現なので、awk次のような一般的な形式で表示します。sub//

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

答え2

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

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

  1. プログラムをawk文字列として渡すのではなく、ファイルに書き込んで(仮定)、そのsubstitution.awkファイルを指す引数をawk使用して実行します(例:)。これにより、単一引用符が文字列終端文字として解放され、プログラムで使用できるようになります。-fawk -f substition.awk
  2. awkシェルはすべてバックスラッシュ(\)をエスケープ文字としてサポートします。これにより、awk次の文字を一般的な方法として解釈することはできませんが、通常の文字として扱う必要があることをシェルに通知できます。つまり、次のいずれかを実行できます。

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

    またはこれ:

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

    最初の例では、シェルから2つの一重引用符をエスケープし、awk2番目の例では二重引用符をエスケープして二重引用符付きのawk文字列を構成します。

答え3

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

答え4

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

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

関連情報