Regex 基于Makefile的Sed

Regex 基于Makefile的Sed,regex,ubuntu,sed,makefile,Regex,Ubuntu,Sed,Makefile,我想在shell脚本中使用sed替换默认的make目标。首先,我试图让sed从命令行开始工作 我的makefile包含: all: gcc -Wall -o main main.c 我希望它包含: all: gcc -Wall -o TEST main.c 我使用的sed命令: sed -i 's/(-o[ ][^ ]+)/-o TEST/g' Makefile 它似乎可以工作,但当我在ubuntu中运行该命令时,它不会编辑我的Makefile。原因可能是什么 ma

我想在shell脚本中使用sed替换默认的make目标。首先,我试图让sed从命令行开始工作

我的makefile包含:

all:
    gcc -Wall -o main main.c
我希望它包含:

all:
        gcc -Wall -o TEST main.c
我使用的sed命令:

sed -i 's/(-o[ ][^ ]+)/-o TEST/g' Makefile
它似乎可以工作,但当我在ubuntu中运行该命令时,它不会编辑我的Makefile。原因可能是什么

main是默认生成目标还是main.c是默认生成目标?有些术语我还不太了解。

您使用的是BRE(而不是ERE)POSIX风格,因此模式中未转义的
匹配文字括号,并且
+
也被解析为文字加号。要在BRE POSIX模式中创建捕获组,需要使用转义括号。无论如何,括号在当前正则表达式模式中是多余的,因为在替换模式中没有使用占位符。在GNU sed中,您仍然可以在BRE模式中使用
+
作为1+出现次数量词,但需要将其转义

使用

来解决这个问题。看


请注意,
\+
量词不是所有的
sed
版本都能识别的,因此,
[^][^]*
(一个后跟0+非空格的非空格)解决方法可能会很有用。

正确的解决方法是参数化Makefile

MAIN := main
all:
    gcc -Wall -o $(MAIN) main.c
现在您可以说
makemain=TEST
(或
makemain=fnord
或您拥有的东西),而无需修改任何内容


修改代码几乎总是错误的解决方案(而生成代码可能是一种功能强大、用途广泛的技术)。

请在帖子中提及您的预期输出。请参阅。您需要转义
+
sed-i的/(-o[][^]\+)/-o TEST/g'Makefile
。另外,您还有多余的括号:
sed-i's/-o[^]\+/-o TEST/g'Makefile
您确定这不是一个错误吗?你到底想达到什么目的?请记住,
make
本身就是一个文本替换工具。您提供的第一行代码修复了这个问题。谢谢在Minix 3.3上也可以吗?@Athylus如果第一个解决方案不起作用,
的/-o[^][^]*/-o TEST/g'
将在那里起作用。
sed -i 's/-o [^ ][^ ]*/-o TEST/g' Makefile
MAIN := main
all:
    gcc -Wall -o $(MAIN) main.c