使用 sed 更改路径并在复制功能中使用结果?

Posted

技术标签:

【中文标题】使用 sed 更改路径并在复制功能中使用结果?【英文标题】:Change a path with sed and use the result in copy function? 【发布时间】:2019-10-27 00:10:30 【问题描述】:

我需要将一些 .sh 文件转换为 .cmd,因为我在 windows 下 - 但使用 Mingw64 和一些 linux 实用程序(如 sed、grep 等...)。

我正在努力解决一个小问题:我在 .sh 脚本中有一些路径是 Linux 路径,因此使用 /,例如: FILEPATH=/opt/My/Troublesome/Path

因为我不想重写所有路径,所以我只是复制/粘贴到 .cmd 中,如下所示: set "FILEPATH=/opt/My/Troublesome/Path" 然后我在 C: 中创建了一个 opt 目录,windows 能够找到这些路径。我可以在没有问题的情况下做到cd %FILEPATH%

但是,copy 并不是那么好。当我尝试copy %FILEPATH%/Myfile .它抱怨语法。当我对双引号做同样的事情时,它说找不到文件。

我尝试使用 sed 更改路径并将其复制到同一行,但我无法使其工作。我已经完成了:

echo "/opt/My/Troublesome/Path/Myfile ." | sed "s~\/~\\~g"

它告诉我:\opt\MyTroublesome\Path\Myfile .

因为这正是我想要的,所以我尝试通过管道将其复制,但它不起作用(无论如何,我对管道从来没有好过):

echo "/opt/My/Troublesome/Path/Myfile ." | sed "s~\/~\\~g" | copy

它说语法错误。我已经尝试了更多的东西,比如: copy < echo "/opt/My/Troublesome/Path/Myfile ." | sed "s~\/~\\~g" 但仍然无法正常工作。

此外,这些是我在 Mingw shell 中尝试过的东西,不确定使用 %FILEPATH% 变量在脚本中会发生什么变化。

有什么想法吗?甚至可以在一行中做到这一点吗?

PS:既然我得到了sed,我很确定我也能得到cp。但我想在我的 .cmd 中尽可能少地使用 linux 功能。 sed后面会用到,所以有它没问题,因为windows没有等价物,但是由于windows上存在copy,所以没有理由使用cp

【问题讨论】:

您不能只通过管道将路径传递给copy 命令,您需要将它们作为参数提供;您可以将路径存储在变量中,例如set "FILEPATH=/opt/My/Troublesome/Path"),然后使用modified value,例如copy "C:%FILEPATH:/=\%\MyFile" .... 这确实有效,谢谢!您可以将其作为答案。我以前读过修改过的值,但我认为我不能使用类似的东西(在我看来,他们可以只改变字符串的一部分,而不是这部分的每次出现) 【参考方案1】:

copy command 期望路径作为命令行参数提供,因此您不能使用 pipe (|) 传递它们。

您可以将 Unix-/Linux 样式的路径存储在一个变量中,然后使用 sub-string substitution 将每个 / 替换为 \,并立即通过 copy 命令使用结果:

rem // Store Unix-(Linux-)style path in variable:
set "FILEPATH=/opt/My/Troublesome/Path"
rem // Precede drive and replace `/` by `\`:
copy "C:%FILEPATH:/=\%\MyFile" .

【讨论】:

以上是关于使用 sed 更改路径并在复制功能中使用结果?的主要内容,如果未能解决你的问题,请参考以下文章

在迷你缓冲区中显示当前文件完整路径的功能

处理/etc/fstab路径,使用sed命令取出其目录名和基名

exec和sed命令

怎么更改OUTLOOK EXPRESS中邮件的存储路径

tomcat更改日志路径

更改 Android Studio/IntelliJ 的 xcrun 开发者路径