在 Windows 的 Git Bash 环境下 Windows 下的路径会自动转换成 Linux 下的格式。比如执行 pwd 显示当前路径,shell 环境下的输出为:

有时我们需要将 Linux 格式的路径转换为 Windows 的格式,方便在 Windows 的软件中使用。此时可以对输出的路径做一下转换,转换步骤可以简化为如下两步:
将盘符转换为 Windows 下的盘符,比如 c => C:\
将斜杠替换成反斜杠
如果盘符数量比较少,可以使用穷举法将可能的盘符全部做转换,写成函数:
function pwdw(){pwd | sed -e 's#^/c#C:#' \-e 's#^/d#D:#' \-e 's#^/e#E:#' \-e 's#/#\\#g'}
将其添加到 .bashrc 中,执行效果:

其中用到了 sed 命令的以下几个特性:
-e 多重编辑,可以在多次转换的基础上多次执行转换
^ 行首定位符
s 替换命令,其中界定符可以使用 # 代替 /,在路径替换时用的比较多
\\ 反斜杠需要转义,即两个斜杆代替一个斜杠
以上 sed 命令在替换盘符上偷了个懒,只考虑到了C盘到E盘,如果盘符过多就没法这样写了。这种硬编码的方式是不可取的,但它也有优点,优点就是简单好理解。我们换一种思路来对盘符做转换:
提取盘符
对盘符做大小写转换,并补全盘符符号
将正斜杠替换为反斜杠
function pwdw(){pwd | sed -e 's#^.\(.\)#\1#' \-e 's#^.#\U&:#' \-e 's#/#\\#g'}
这里就有点不好理解了,我们拆开来解释:
^. 界定行首的的第一个字符,即盘符/c 的斜杠
\(.\) 第二个字符我们用字串标签来代替
\1 这里的占位符即第一个标签,如果有多个子串,可以用\1 \2 来代替,在这里的作用就是把盘符单独取出来,相当于删掉了第一个斜杠
\U 是大小写转换命令,这里是大写转换
& 这个命令代表的是搜索到的内容,这里就是指盘符
最后一步是做正反斜杠的替换
这里使用了 sed 的 \(.\) 子串语法,有点为了用而用的感觉。实际上不提取盘符也可以,直接删掉第一个字符即可。简化后的代码如下:
function pwdw(){pwd | sed -e 's#^.##' \-e 's#^.#\U&:#' \-e 's#/#\\#g'}
我们可以组合一下显示当前文件的全路径:
function sedw(){sed -e 's#^.##' \-e 's#^.#\U&:#' \-e 's#/#\\#g' $*}function lsw(){ls `pwd`/$1 | sedw}
执行效果如下:

如果需要处理多个文件,可以加一个 for 循环:
function sedw(){sed -e 's#^.##' \-e 's#^.#\U&:#' \-e 's#/#\\#g' $*}function lsw(){for i in $@dols `pwd`/$i | sedwdone}
执行效果如下:

关于 sed 的语法和命令可以参考:
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。




