二重引用符の前にバックスラッシュを含む二重引用符(または文字列などのテキスト行)を含む文字列がある場合、sedがバックスラッシュの前にない二重引用符を別の文字に置き換える最善の方法は何ですか?または文字列?
original string 'Abc \"NN""xyz\"ddd"ee "ff" \"QQ\"'
replace non backslash double-quote with percent symbol
new string 'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"'
これまでに私が見つけた唯一の方法は、最初に「バックスラッシュ二重引用符」の組み合わせをテキストに見つけることができず、代替文字や文字列とは異なる一意の文字または文字列に置き換えることです。 double引用符を必要なものに置き換え(例:バックスラッシュ二重引用符、またはこの場合は明確にするためにパーセント記号)、残りの文字列のみを元のバックスラッシュ二重引用符に変更します。したがって、この方法を使用するには、sedを3回呼び出す必要があります。
もしそうなら、sedを使ってこれを行うより簡単な方法はありますか?
答え1
GNUの使用sed
$ sed -E ':a;s/(\\")([^\]*)"/\1\2%/;ta' input_file
'Abc \"NN%%xyz\"ddd%ee %ff% \"QQ\"'
答え2
sed -e 's/[\]"/%/g' -e 'y/"%/%"/' -e 's/"/\\"/g'
これは最初に各項目\"
を置き換えます%
。そうすればすべてが変わり、その逆%
も同様です"
。最後に、残りの二重引用符はすべてエスケープされます。
文字列%
に開始する内容がない場合は、エスケープされていない二重引用符がすべて置き換えられます%
。
または、@
最初からデータにはならない追加の文字を使用する場合:
sed -e 's/[\]"/@/g' -e 'y/"/%/' -e 's/@/\\"/g'
このバリエーションは、何が起こっているのかをより明確に示しており、あなたの質問で提案されています(sed
一度の呼び出しだけを使用しても)。エスケープされていない二重引用符を変更しながら、エスケープされた二重引用符が入ると一時的に「非表示」になります%
。完了したら復元します。
答え3
ストリームエディタ-E|-r
の拡張正規表現機能を利用してください()GNU sed
。
問題は、バックスラッシュが偶数(0は偶数)の前にバックスラッシュ以外の文字または行の先頭が続く引用符文字を検出することです。
見積もりはパーセント記号に変換されます。
二重引用符のバージョンです。
sed -E -f - <<\eof file
:a;s/((^|[^\])([\][\])*)"/\1%/g;ta
eof
一重引用符のバージョン。
sed -E -f - <<\eof file
:a;s/((^|[^\])([\][\])*)'/\1%/g;ta
eof