У меня есть путь Windows в переменной удара как строка:
file='C:\Users\abcd\Downloads\testingFile.log'
Я пытаюсь преобразовать этот путь к пути Linux, запускающемуся с /c/Users...
.
Моя попытка
Следующие работы:
file=${file/C://c}
file=${file//\\//}
echo $file
> /c/Users/abcd/Downloads/testingFile.log
Проблема
Здесь, я сделал это для строки, которая содержит filepath. Причина, которую я задаю этому вопросу, состоит в том, что я должен преобразовать 20 таких строк в сценарии удара в Ubuntu 16.04 и каждый раз, когда я делаю это, я должен записать 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
file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"
, эти два шаблона должны остаться отдельными, тем не менее, поскольку соответствия заменяются различными заменами.
Этот вопрос все еще открыт для новых предложений? Если да, то поможет ли это вам?
$ 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