使用。 。 。交換「\/」

使用。 。 。交換「\/」

/tmp/testing置き換えたい文字列があります。\/tmp\/testing

sed次のようにうまく動作します。

echo testdir=/tmp/testing | sed 's/\//\\\//g'
testdir=\/tmp\/testing

ただし、後で使用したい変数にそれを入れようとすると、次のエラーが発生します。

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\//g'`
sed: -e expression #1, char 9: unknown option to `s'

どんなアイデアがありますか?

答え1

バックティックは`...`間接レベルを追加し、別の\エスケープセットが必要です。これを使用すると、うまく動作し、$( ... )期待どおりに動作します。

myvar=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')
echo "$myvar"
testdir=\/tmp\/testing

バックティックの使用にこだわると、次のように動作します。

myvar=`echo testdir=/tmp/testing | sed 's/\//\\\\\//g'`
echo "$myvar"
testdir=\/tmp\/testing

答え2

この試み

$ echo testdir=/tmp/testing | sed 's/\//\\\//g'
testdir=\/tmp\/testing

変数に

var=$(echo testdir=/tmp/testing | sed 's/\//\\\//g')

答え3

バックティック内のバックスラッシュはある種の特別なケースです。これがバックティックを絶対に使用しないもう一つの理由です$(cmd)http://mywiki.wooledge.org/BashFAQ/082

参照を設定できます。たくさん/たとえば、パターンに 。

myvar=$(printf '%s' "$oldpath" | sed 'sX/X\\/Xg')

あるいは、bashを使用していることがわかっている場合は、データの変更を避けるためprintfに使用しないでください(ファイル名がで始まる場合など)、純粋なbash文字列操作のみを使用してください。echo-

myvar=${foo//\//\\/}   # sed 'sX/X\\/Xg'

/区切り文字として機能する他の方法がないため、読みにくくなります。より良い点は、/パターンの先頭からすべての項目を変更することです。また、パターンと置換は異なる方法で処理されます。 sedが使用するものと同じ末尾がないため、代替文字列からesをエスケープする/必要はありません。/それにもかかわらず、さまざまな点でsedとは異なるので、コメントを残す必要があります。

パフォーマンスと堅牢性の面では「より優れています」が、読みやすさや移植性の面ではそうではありません。これはシェルプログラミングプロセスに似ています。

答え4

bash変数拡張|交換を使用できます。

testdir="${testdir//\//\\\/}"

関連情報