二重アポストロフィの代わりに単一のアポストロフィを試してみてください。しかし、正しくできませんでした。
sed 's/'/"/'
答え1
Bourneなどのシェルでは、一重引用符を一重引用符でエスケープできないため、シェルのコマンド'\''
ラインまたはスクリプトで一重引用符で囲まれた文字列に一重引用符を含める標準的な方法も同様です。実際には一重引用符は含まれませんが、目的の最終結果が得られます。
'\''
= '
(引用符の終わり)\'
(引用符のエスケープ)と'
(引用符を開く)。
つまり、そうではありません:
sed 's/'/"/g'
使用:
sed 's/'\''/"/g'
または、二重引用符内でバックスラッシュでエスケープすることができるので、以下を使用できます。
sed "s/'/\"/g"
この形式に注意してください。文字列リテラルとして処理するシェルメタ文字を二重引用符で囲んでエスケープする必要があります。たとえば、fooを現在のシェル変数の値で置き換えるsed 's/foo/$bar/'
文字列リテラルで置き換えます(定義されていない場合は何も置き換えられません。)注:変数の一部の値はsedコマンドを中断する可能性があります。 (これはsedコマンドで構文エラーを引き起こします)$bar
sed "s/foo/$bar/"
$bar
$bar
$bar
bar='a/b'
s/foo/a/b/
別の(おそらく最良の)代替案は、引用符を使用して$''
文字列を引用することです。この引用スタイルを使用すると、単一引用符をエスケープできます。これはシェルが引用符付き文字列を解釈する方法を変更するため、文字列に別のエスケープ文字または文字列が含まれている場合は、他の副作用がある可能性があります(たとえば、「\xHH
HH」は内部8ビット文字の16進数として解釈されます)。$''
)。引用符がない場合、または二重引用符内にある場合は、平文「xHH」と解釈されます。
sed $'s/\'/"/g'
注:$''
bash、ksh、zshなどに適用されます。では動作しませんdash
。
答え2
使用tr
(フルファイルでグローバルにこれを行う場合):
tr "'" '"' <infile >outfile
行為
sed 's/'/"/'
デフォルトでは、スラッシュと閉じていない二重引用符文字列にsed 's/'
従います。/"/'
そして
sed s/\'/\"/
そのような問題はありません。
sed
表現を引用する方が良いと思われる場合(この場合は必要ありません)、次のようにします。
sed 's/'"'"'/"/'
sed 's/'
次は("'"
二重引用符一重引用符)、次はです'/"/'
。
tr
また、シミュレートする場合、つまりsed
単一文字の翻訳を実行する場合は、以下を使用y///
します。たくさん以下を使用するよりも効率的ですs///g
(注/g
):
sed y/\'/\"/
答え3
echo "don't forget that" | sed 's/\x27/\"/'
答え4
完全なsed
式を引用する必要はありません。
echo \' | sed s/\'/\"/