【问题标题】:sed replace forward slash with backslashsed 用反斜杠替换正斜杠
【发布时间】:2013-05-30 18:25:12
【问题描述】:

我必须使用 mingw32 在生成文件中将具有正斜杠的文件名转换为具有反斜杠的文件名。我使用以下 sed 命令将结果存储在变量中:

ORIGINAL=./a/b/main1.c ./a/b/main2.c ./a/b/main3.c

sed 命令:

RESULT=$(shell echo $(ORIGINAL) | sed 's/\//\\/g')

结果输出是:

.\a\b\main1.c .abmain2.c .abmain3.c

如果我直接在 bash 上运行它就可以正常工作。谁能告诉我怎么了?

谢谢!

【问题讨论】:

  • 这给了我bash 中的错误(“原始:未找到命令”和“外壳:未找到命令”)。但这有效:RESULT=$(echo $ORIGINAL | sed 's/\//\\/g')
  • 我相信windows会接受正斜杠:你需要这样做吗?

标签: sed makefile mingw32


【解决方案1】:

make 调用的 shell 很可能不是 bash。但是,我发现您看到的任何 shell 的行为都非常奇怪(它会替换第一个单词,但不会替换其余单词?!?!)

您是否考虑过使用 GNU make$(subst ...) 函数来代替 shell?

【讨论】:

  • 替换斜杠:RESULT := $(subst /,\\,$(ORIGINAL))
【解决方案2】:

我正在尝试在 makefile 中复制您的测试,但我没有您的环境。 但如果我正在搜索相同的字符,我不会使用“/”作为命令分隔符。使用其他字符,例如 ':'

sed 's:/:\\:g'

【讨论】:

  • 这样可以节省很多时间!我希望我知道更改 sed 中的分隔符。
【解决方案3】:
RESULT=$(sed 's/\//\\/g' <<< "$ORIGINAL")


$ ORIGINAL='./a/b/main1.c ./a/b/main2.c ./a/b/main3.c'
$ echo "$ORIGINAL"
./a/b/main1.c ./a/b/main2.c ./a/b/main3.c
$ RESULT=$(sed 's/\//\\/g' <<< "$ORIGINAL")
$ echo $RESULT
.\a\b\main1.c .\a\b\main2.c .\a\b\main3.c

【讨论】:

  • 这在 makefile 中不起作用,因为它使用 &lt;&lt;&lt;,这是 bash 的一个功能,并且在标准 POSIX sh 中不受支持,这是 make 使用的。无论如何,原来的例子在shell中工作,没有必要诉诸&lt;&lt;&lt;
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2022-11-25
  • 2011-10-14
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多