Unix awkは内部一重引用符を反転疑問符に置き換えます。

Unix awkは内部一重引用符を反転疑問符に置き換えます。

内側の一重引用符を反転疑問符(¿)に置き換えたい(外側の一重引用符を無視)。以下のコマンドを使用していますが、awk動作しません。セミコロンは区切り記号です。

awk -F "'" -v OFS="'" '{for  (i=2; i<=NF; i+=2) gsub("'","\302\277", $i } 1' filename

データは次のとおりです

'gasg'dhsh';'dhdjs'

答え1

¿ファイルの単語の周りのすべての単一引用符を置き換えるには(bash使用できるように使用すると仮定$'...'):

q=$'\302\277'
sed "s/\>'\</$q/g" file

または

q=$( printf '\302\277' )
sed "s/\>'\</$q/g" file

または

sed "s/\>'\</¿/g" file

入力が与えられると、以下が生成されます。

'gasg¿dhsh';'dhdjs'

このパターンは、直前と後ろに単語文字がある\>'\<すべてのパターンと一致します。'文字;と行の開始/終了は単語文字ではありませんが、両方gですd


コードには3つの主な問題があります。

  1. シェルで一重引用符で囲まれた文字列に一重引用符を含めることはできません。呼び出しに含まれる一重引用符は、gsub()コードである一重引用符で囲まれた文字列を終了し、構文awkエラーを生成します。

  2. 入力フィールド区切り文字を一重引用符に設定すると、入力はすべての一重引用符に分割されます-F "'"awkつまり、awkプログラムいいえ一重引用符が表示されるため、gsub()何も変更できません。

  3. 文字列は、\302\277エスケープシーケンスとして解釈されない限り、反転疑問符ではありません。

これらの問題をすべて修正すると、プログラムは正常に実行されますが、すべての一重引用符が置き換えられます。

$ awk -F ';' -v OFS=';' '{ for (i=1; i<=NF; ++i) gsub("'"'"'", sprintf("\302\277"), $i); print }' file
¿gasg¿dhsh¿;¿dhdjs¿

答え2

「内部一重引用符」とは、「外部一重引用符」があることを意味し、これらの外部引用符が各フィールドの先頭と末尾(この場合は「;」で区切られている)にあると仮定すると、次のようになります。

$ awk -F ';' '{OFS=FS;for(j=1;j<=NF;j++){gsub(q,i,$j);sub("^"i,q,$j);sub(i"$",q,$j)}}{print}' q='\047' i='¿'
'gasg¿dhsh';'dhdjs'

関連情報