暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Windows 与 Linux 路径格式转换

生有可恋 2022-10-20
5754

在 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 $@
            do
            ls `pwd`/$i | sedw
            done
            }


            执行效果如下:

            关于 sed 的语法和命令可以参考:


            全文完。

            如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

            文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论