文字列としてbash変数にWindowsパスがあります:
file='C:\Users\abcd\Downloads\testingFile.log'
このパスを/c/Users...
で始まるLinuxパスに変換しようとしています。
私の試み
次の作品:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
問題
ここでは、ファイルパスを含む文字列に対してこれを実行しました。この質問をしている理由は、Ubuntu 16.04のbashスクリプトで20個のそのような文字列を変換する必要があり、そのたびに変換ごとに2行を記述する必要があるためです。
質問
2つのコマンドを組み合わせる方法はありますか
file=${file/C://c}
file=${file//\\//}
一つのコマンドに?
sed
を使用して両方の置換を一度に行う方法がありますが、必ずしも必要ではありません。
この問題を解決する方法は次のとおりです。
filenames=(
'C:\Users\abcd\Downloads\testingFile.log'
# ... add more here ...
)
for f in "${filenames[@]}"; do
f="${f/C://c}"
f="${f//\\//}"
echo "$f"
done
出力する代わりに出力を配列に入れたい場合は、echo
行を割り当てに置き換えます。
filenames_out+=( "$f" )
何度もやりたいことなら、小さなシェル関数を作成してみませんか?
win2lin () { f="${1/C://c}"; printf '%s\n' "${f//\\//}"; }
$ file='C:\Users\abcd\Downloads\testingFile.log'
$ win2lin "$file"
/c/Users/abcd/Downloads/testingFile.log
$
$ file='C:\Users\pqrs\Documents\foobar'
$ win2lin "$file"
/c/Users/pqrs/Documents/foobar
これは、sedを使用して1行で実現できます。
file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"
それにもかかわらず、一致は異なる置換によって置き換えられるため、2つのパターンは別々のままにしておく必要があります。
この質問はまだ新しい提案を受け入れていますか?もしそうなら、これはあなたを助けますか?
$ file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '\\' '/')"
$ echo $file
/C:/Users/abcd/Downloads/testingFile.log
ああ、Cを小文字にキャストする必要がある場合:
file="/$(echo 'C:\Users\abcd\Downloads\testingFile.log'|tr '^C' 'c'|tr '\\' '/')"
概要として:
$ file='C:\Users\abcd\Downloads\testingFile.log'
$ echo $file
C:\Users\abcd\Downloads\testingFile.log
$ file="/$(echo $file|tr '^C' 'c'|tr '\\' '/')"
$ echo $file
/c:/Users/abcd/Downloads/testingFile.log