内側の一重引用符を反転疑問符(¿)に置き換えたい(外側の一重引用符を無視)。以下のコマンドを使用していますが、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つの主な問題があります。
シェルで一重引用符で囲まれた文字列に一重引用符を含めることはできません。呼び出しに含まれる一重引用符は、
gsub()
コードである一重引用符で囲まれた文字列を終了し、構文awk
エラーを生成します。入力フィールド区切り文字を一重引用符に設定すると、入力はすべての一重引用符に分割されます
-F "'"
。awk
つまり、awk
プログラムいいえ一重引用符が表示されるため、gsub()
何も変更できません。文字列は、
\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'