変数をsedに渡し、バックスラッシュをスラッシュに変更します。

変数をsedに渡し、バックスラッシュをスラッシュに変更します。

DFS経由でWindows共有をマウントするためのbashスクリプトを作成していますcifs。私の主な部分は機能しますが、ユーザーがDFSパスを変数として入力し、バックスラッシュをスラッシュに変換する必要がある場合に問題があります。

 #!/bin/bash

 FILE='\\edi3\welshch\test'

 FILEPATH="$("$FILE" | sed -e 's/\\/\//gp')"
 echo $FILEPATH

コマンドを使用してADホームディレクトリのファイルパスを検索し、部分的にsedにパイプする別のスクリプトがあります。| sed -e 's/\\/\//gp

しかし、上記のスクリプトは私に提供しています。 ./test.sh: line 10: \\edi3\welshch\test: command not found

答え1

コマンドの置き換えでは、"$FILE" | sed -e 's/\\/\//gp'シェルはそれを(同じ)に拡張します'\\edi3\welshch\test' | sed -e 's/\\/\//gp'。なぜなら注文する、シェルはrunというファイルを探します\\edi3\welshch\test

パイプされたコンテンツを使用する予定かもしれませんecho "$FILE" | sed ...FILEsed

これが正しくない場合でも、一部のバージョンではechoバックスラッシュをエスケープ文字として扱い、混乱を招きます。printf "%s\n" "$FILE" | sed ...すべてのシェルで動作するために必要です。望むより:なぜprintfがechoより優れているのですか?

また、デフォルトの動作は、sed操作を実行した後に行を印刷することです。/pon コマンドを使用すると、追加のs///印刷が発生するため、出力に結果が 2 回表示されます。

つまり、Bashを使用しているので、文字列置換拡張を使用できます。

#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"

出力を提供します//edi3/welshch/test

答え2

単一の文字を置き換えるには、使いやすくなります。tr(1):

FILE=$(echo "$FILE" | tr '\\' / )

答え3

この変数はエコーを介してsedに出力する必要があります。 sed出力を抑制するために使用されますsed -n編集するsed -n- sedフラグを省略すると必要ありませんp

#!/bin/bash

FILE='\\edi3\welshch\test'

FILEPATH="$(echo "$FILE" | sed 's/\\/\//g')"
echo $FILEPATH

関連情報