sed 错误靠近意外标记 '(' where ( 是搜索字符串的一部分

Ste*_*fan 3 regex bash sed

我尝试在 Makefile 中搜索和替换给定的字符串,即

PROCFLAGS="SQLCHECK=SEMANTICS USERID=$(CONNECT)"
Run Code Online (Sandbox Code Playgroud)

我想添加CODE=ANSI_C到行的地方

PROCFLAGS="SQLCHECK=SEMANTICS USERID=$(CONNECT) CODE=ANSI_C"
Run Code Online (Sandbox Code Playgroud)

Sed 应该很好地完成这个技巧.. 至少我是这么想的,但我无法理解我正在调用 sed 的语法错误:

sed -i'.bak' s:(CONNECT):(CONNECT) CODE=ANSI_C:g Makefile
Run Code Online (Sandbox Code Playgroud)

我试图添加-r或转义括号,\( \)但我总是以错误告终:

-bash: syntax error near unexpected token `('
Run Code Online (Sandbox Code Playgroud)

我只能想到我在这里必须做错的事情,因为许多其他替代品确实可以正常工作。

Squ*_*dly 5

尝试引用括号中的项目。Bash 正试图在我认为的子 shell 中运行 (CONNECT)

sed -i'.bak' "s:(CONNECT):(CONNECT) CODE=ANSI_C:g" Makefile
Run Code Online (Sandbox Code Playgroud)

当你把一些东西放在括号里时,bash 会将它作为子shell 中的命令运行。

例如,尝试(cd /tmp; pwd); pwd。您将看到子shell print /tmp,但是第二个pwd会告诉您原始目录。

  • 是的,bash 将尽其所能扩展/解释事物,然后再将它们传递给正在运行的程序。例如,'*'(一个 glob)在传递给程序之前会被扩展,除非它只匹配 0 或 1 个东西,然后它会按字面传递。 (2认同)