Saya memiliki jalur Windows di variabel bash sebagai string:
file='C:\Users\abcd\Downloads\testingFile.log'
Saya mencoba mengubah jalur ini menjadi jalur Linux yang dimulai dengan /c/Users...
.
Usaha saya
Karya-karya berikut:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Masalah
Di sini, saya telah melakukan ini untuk string yang berisi file path. Alasan saya mengajukan pertanyaan ini adalah bahwa saya harus mengonversi 20 string seperti itu dalam skrip bash di Ubuntu 16.04 dan setiap kali saya melakukan ini, saya harus menulis 2 baris per konversi - ini menghabiskan banyak ruang!
Pertanyaan
Apakah ada cara untuk menggabungkan 2 perintah
file=${file/C://c}
file=${file//\\//}
menjadi satu perintah?
Jawaban:
Akan ada cara untuk melakukan penggantian keduanya sekaligus menggunakan
sed
, tetapi itu tidak perlu.Inilah cara saya mengatasi masalah ini:
Jika Anda ingin meletakkan output ke dalam array daripada mencetak, ganti
echo
baris dengan tugas:sumber
f1
danf2
, bagaimana cara kerjanya? Maksud saya, bagaimana cara menetapkan ulang nama file baru ke array dengan mengganti yang lama?Jika itu sesuatu yang ingin Anda lakukan berkali-kali, mengapa tidak membuat fungsi shell kecil?
sumber
/c/Users...
- melainkan memberiC:\Users\...
.cdw () { f="${1/D://d}"; cd "/mnt${f//\\//}"; }
subsistem Windows untuk Linux, bekerja seperti pesona!Anda akan dapat mencapai ini dalam satu baris menggunakan sed
Perhatikan bahwa kedua pola harus tetap terpisah karena pertandingan diganti dengan pergantian yang berbeda.
sumber
file="$(sed 's|^C:|/c|; s|\\|/|g' <<< "$file")"
Apakah pertanyaan ini masih terbuka untuk saran baru? Jika demikian, apakah ini akan membantu Anda?
Oh, dan seandainya C harus dilemparkan ke huruf kecil:
Sebagai gambaran umum:
sumber
'^C'
?^
yang telah digunakan dalam beberapa jawaban lain di sini juga. Terima kasih atas jawabannya dan penjelasannya.