我在 bash 变量中有一个作为字符串的 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
问题
在这里,我已经对包含文件路径的字符串执行了此操作。我问这个问题的原因是我必须在 Ubuntu 16.04 中的 bash 脚本中转换 20 个这样的字符串,并且每次执行此操作时,我都必须为每次转换编写 2 行代码 - 这占用了大量空间!
问题
有没有办法将这两个命令结合起来
file=${file/C://c}
file=${file//\\//}
合并成一个命令?
答案1
有一种方法可以同时进行两个替换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" )
答案2
如果这是您想要多次执行的操作,那么为什么不创建一个小的 shell 函数呢?
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
答案3
您可以使用 sed 在一行中实现此目的
file="$(echo "$file" | sed -r -e 's|^C:|/c|' -e 's|\\|/|g')"
请注意,由于匹配项被不同的替换项所取代,因此这两个模式必须保持分离。
答案4
这个问题是否仍接受新的建议?如果是,这会对你有帮助吗?
$ 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