在bash脚本中替换字符串(MacOS)

时间:2014-02-13 14:34:01

标签: macos bash sed

我在Makefile中生成了以下代码:

    ${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分钟帮助我 这将是伟大的。

我在这里拔毛。

由于

1 个答案:

答案 0 :(得分: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命令是单引号字符串,通常更容易使用(您无需担心shell扩展字符串)。

第一个命令的棘手方面是单引号不能包含在单引号字符串中(即使转义不是一个选项),因此该命令只需分成两个单引号字符串"''" - 相当于'' - 拼接。

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