/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//\//\\\/}"