2014-02-13 138 views
0

我已经在Makefile中生成以下代码:替换bash脚本(MacOS的)字符串

${SED} -i '' -e "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles) 
# ${SED} -i "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles) 

,我想用

# ${SED} -i '' -e "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles) 
    ${SED} -i "s|(DESTDIR)|${DESTDIR}|g" $(pcfiles) 

更换所以它只是注释掉一个的问题一行,并替换其他。

但由于单引号和双引号我无法实现它。

如果一些正则表达式专家愿意花1-2分钟帮我出 那会很棒。

我在这里拉我的头发。

感谢

+0

如果它在'Makefile'中生成_请考虑修复源代码。如果要再次生成它,则需要运行脚本才能修复它。 – devnull

+0

严重的是我无法修复源代码,因为它是在Mac上生成和交叉编译的。如果你能帮助完成一个简单的“sed”变化。 – Disco

回答

1
# Comment out 1st line. 
sed -E 's`([[:space:]]*\$\{SED\} -i '"''"' -e "s\|\(DESTDIR\)\|\$\{DESTDIR\}\|g" \$\(pcfiles\))`#\1`' Makefile 
# Uncomment 2nd line. 
sed -E 's`#([[:space:]]+\$\{SED\} -i "s\|\(DESTDIR\)\|\$\{DESTDIR\}\|g" \$\(pcfiles\))`\1`' Makefile 

sed命令在单引号字符串,这是通常更易于使用(你不用担心外壳扩展您的字符串)。

第一个命令的棘手方面是单引号不能包含在单引号字符串中(即使转义也不是一个选项),所以命令简单地分成两个单引号字符串,其中"''" - 总计为'' - 拼接英寸

另一个棘手的方面是要逃避所有特殊的正则表达式字符。对。