Sed脚本在类似平台上的表现不同

时间:2017-03-09 12:24:55

标签: gcc sed cygwin

我正在从Cygwin建立一个项目。除此之外,GCC编译器创建依赖文件,然后调用sed脚本来修复"修复"依赖文件。

脚本完成后,在一个系统上,依赖项文件包含,例如:

src/man/man.o: \[LF]
../include/debug.h \[LF]
../include/sys.h ../include/types.h \[LF]

并在另一个系统行结尾上由脚本更改为:

src/man/man.o: /[CR][LF]
../include/debug.h /[CR][LF]
../include/sys.h ../include/types.h /[CR][LF]

带正斜杠和[CR][LF]的第二种情况打破了构建。

为什么脚本的行为会有所不同?

以下是关键的sed行:

    @sed -i -e's/\\\(.\)/\/\1/g' $(@:.o=.d) ;\

任何人都可以破译为什么它依赖于系统?

1 个答案:

答案 0 :(得分:1)

sed -i -e's/\\\(.\)/\/\1/g'

找一个反斜杠(\\),后跟一些东西(.)(即不在行尾),并用正斜杠替换它,加上随后的内容( \1)...

$(@:.o=.d)

...在依赖文件中......? (Haven之前没有见过这个,但看起来像#34;每个.d对应.o。)

其余的看起来与你的问题无关。

猜测这是将Windows路径转换为Unix路径的粗略方式的一部分......我猜测那里的<CR>(不知道) 来自哪里)使得无法正常运行。

如果您在此之前添加dos2unix以摆脱<CR>会怎样?

define DEPEND_HACK
    @dos2unix $(@:.o=.d) ;\
    sed -i -e's/\\\(.\)/\/\1/g' $(@:.o=.d) ;\
    ....