sed を使用してテキストを置き換え、一重引用符を追加します。

sed を使用してテキストを置き換え、一重引用符を追加します。

私は答えたこの問題ところで、一重引用符を追加しなければならない部分で詰まりました。

元のファイルと同じです。

$$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\\\$$

.gsedの先頭に固定しているので、交換が複数回行われるとは予想しません。

おすすめ記事