2013-05-30 184 views
2

我必须使用mingw32将具有正斜杠的文件名转换为具有反斜杠的生成文件中的文件名。我用下面的sed命令将结果存储在一个变量: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上运行它。谁能告诉我什么是错的?

谢谢!

+0

这使我在'bash'(“ORIGINAL:command not found”和“shell:command not found”)中出错。但是这个工作原理:'RESULT = $(echo $ ORIGINAL | sed's/\ // \\/g')' – lurker

+0

我相信windows会接受正斜杠:你需要*来做这件事吗? –

回答

2

最有可能使得调用的shell不是bash。然而,我发现你看到的任何shell的行为都很奇怪(它取代了第一个单词,但不是其他的?!?)

你有没有考虑过使用GNU make$(subst ...)函数,而不是shell ?

+0

替换斜杠:RESULT:= $(subst /,\\,$(ORIGINAL)) –

5
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 
+0

这不适用于makefile,因为它使用'<<<'''bash'的一个功能,并且不支持标准POSIX'sh',这是'make'使用的。无论如何,最初的例子在外壳中工作,没有必要诉诸'<<<' – MadScientist

5

我试图在生成文件中复制您的测试,但我没有你的环境。 但是如果我搜索同一个字符,我不会使用'/'作为命令分隔符。使用另一个字符,如':'

sed 's:/:\\:g' 
+0

这是一个节省时间!我希望我知道如何更改'sed'中的分隔符。 – radj