私は答えたこの問題ところで、一重引用符を追加しなければならない部分で詰まりました。
元のファイルと同じです。
$$BATCHCTRL=TEST-012017
$$STATE=CA AZ
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
新しいファイルは次のようになります。
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
使った
sed -Ei 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE=\1/g' sed_file
だから私は次のようになります:
$$BATCHCTRL=TEST-012017
$$STATE=CA
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
しかし、今は一重引用符を追加することはできません。私は一重引用符の代わりに二重引用符を使用してエスケープし、引用符を使用しようとしませんでしたが、そのうち何も機能しません。
ベストアンサー1
2つのオプション:
一重引用符で囲まれた文字列を式で一時的に停止し(引用符で囲まれた一重引用符文字)を挿入してsed
続行します。"'"
他の引用も繰り返します。
$ sed -E 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/$$STATE='"'"'\1'"'"'/' file
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
$
代替文字列からエスケープする必要はありません。
\'
代わりに使用することもできます"'"
。
$ sed -E 's/^\$\$STATE=([A-Z]{2}) ([A-Z]{2})/$$STATE='\''\1'\''/' file
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
または、
式の周囲には二重引用符を使用し、その中には一重引用符を通常の文字として使用します。これを行うには、$
既存のすべてのバックスラッシュと文字をシェルから保護する必要があります。
$ sed -E "s/^\\\$\\\$STATE=([A-Z]{2}) ([A-Z]{2})/\$\$STATE='\1'/" file
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/2017
正規表現からリテラル文字列sed
(および代替部分のリテラル文字列)を取得しようとしているので、ここではエスケープが多すぎます。シェルの二重引用符内ではリテラルだけです。バックスラッシュの後に続き、シェルは拡張(またははい)で次のすべてを使用しようとします。使用してリテラルバックスラッシュとリテラルを提供します。\$
$
\$
$
\\$
$
$
$$
$STATE
\\\$
$
.g
行sed
の先頭に固定しているので、交換が複数回行われるとは予想しません。