【问题标题】:Sed on a Makefile生成文件上的 Sed
【发布时间】:2018-07-21 18:59:01
【问题描述】:

我想在 shellscript 中使用 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

它似乎适用于https://regexr.com/,但是当我在 ubuntu 中运行该命令时,它不会编辑我的 Makefile。可能是什么原因?

main 也是默认的 make 目标,还是 main.c 是默认的 make 目标?一些术语我还不太明白。

【问题讨论】:

  • 请在您的 POST 中提及您的预期输出。
  • 见documentation for sed regex。你需要转义+:sed -i 's/(-o[ ][^ ]\+)/-o TEST/g' Makefile。此外,您还有多余的括号:sed -i 's/-o [^ ]\+/-o TEST/g' Makefile
  • 你确定这不是XY-Problem?你真正想要达到什么目的?请记住,make 本身就是一个文本替换工具。

标签: regex ubuntu sed makefile


【解决方案1】:

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

使用

sed -i 's/-o [^ ]\+/-o TEST/g' Makefile

或者

sed -i 's/-o [^ ][^ ]*/-o TEST/g' Makefile

解决问题。请参阅online demo。

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

【讨论】:

  • 您提供的第一行代码解决了这个问题。谢谢!这也适用于 Minix 3.3 吗?
  • @Athylus 如果第一个解决方案不起作用,'s/-o [^ ][^ ]*/-o TEST/g' 将在那里起作用。
【解决方案2】:

正确的解决方案是参数化 Makefile。

MAIN := main
all:
    gcc -Wall -o $(MAIN) main.c

现在你可以说make MAIN=TEST(或make MAIN=fnord或你有什么)而不用修改任何东西。

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

【讨论】:

    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2018-04-03
    • 2021-12-24
    相关资源
    最近更新 更多