私は答えたこの問題ところで、一重引用符を追加しなければならない部分で詰まりました。
元のファイルと同じです。
$$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
の先頭に固定しているので、交換が複数回行われるとは予想しません。
答え2
bash
FWIW、次を使用して、コマンドライン呼び出しsed
で一重引用符内のプラス記号を置き換えることができます。
$ sed -e 's/$$STATE=\([A-Z][A-Z]\) [A-Z][A-Z]$/$$STATE='"'\1'/" sed_file
これにより、「過度のバックスラッシュ」(「バックスラッシュ炎」を引き起こすことが知られている)を避けることができます。
考慮すべき点がいくつかあります。
$
s/// コマンドの lhs で最後のエントリを除く別の場所で使用すると、メタ文字の状態が失われます。もちろん、一重引用符で囲む必要があります。 bashはとにかく変数を起動して拡張します。私はsedがすることについて話しています。s //コマンドの右側にある$はメタ文字ではないため、エスケープする必要はありません。
sed は -re モードではなく -e モードにあります。
ファタイ
答え3
私は次を試しました
sed "/^\$\$STATE/s/ .*/'/g" filename| sed "/\$\$STATE/s/=/&'/g"
出力
$$BATCHCTRL=TEST-012017
$$STATE='CA'
$$FROM_DATE=01/10/2017
$$TO_DATE=01/30/201