Bash では、一重引用符はエスケープの種類をまったく受け入れません。たとえば、次のコマンドを書いたとします。
$ echo '\''
>
Bash は'
、2 番目の で閉じられた文字列を開いたと見なし、'
のみを含む文字列を生成します\
。次'
の は、新しい文字列の開始と見なされるため、bash は次の行でさらに入力を期待します ( によって通知されます>
)。
echo
この事実に気付いていない場合、以下のコマンドの後の文字列はまだ開いていると思うかもしれませんが、閉じています。
$ echo 'will this string contain a single quote like \'
will this string contain a single quote like \
だから、あなたが書くとき
'gsub("class\\\'\\\'>","class\\\'\\\'> ")'
gsub("class\\\
バックスラッシュと引用符(\'
)で連結された文字列を書いています。次に大なり信号。この後、","
はコンマを含む文字列として解釈されます。これは、式の先頭の一重引用符が以前に閉じられていたためです。今のところ、結果は次のとおりです。
gsub("class\\\\'>,
コンマの後に文字列がありclass
、その後にバックスラッシュと引用符が続き、その後に別のバックスラッシュと別の引用符が続き、最後に大なり記号とスペースが続きます。これは現在の文字列です:
gsub("class\\\\'>,class\'\'>
これは有効な awk 式ではありません! とにかく、さらに悪いことに、二重引用符"
は文字列を開始し、閉じ括弧と単一引用符を含みますが、この文字列は決して閉じられません!
要約すると、問題は、Bash で文字列を開いた場合、その前にバックスラッシュをいくつ入れても'
、次の文字列で強制的に閉じられることです。'
解決策'
: andを使用して文字列を開いたり閉じたりするいくつかのトリックを作成できますが、"
すぐに面倒になります。私の提案する解決策は、 awk 式をファイルに入れることです。次に、-f
awk のフラグを使用します。このフラグにより、awk は次のファイルを実行します。
$ cat filename # The file to be changed
class''>
class>
class''>
$ cat mycode.awk # The awk script
gsub("class''>", "class''>[PSEUDOSPACE]")
$ awk -f mycode.awk filename # THE RESULT!
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]
ファイルを書きたくない場合は、いわゆるhere ドキュメントを使用します。
$ awk -f- filename <<EOF
gsub("class''>", "class''>[PSEUDOSPACE]")
EOF
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]