在sed正则表达式中转义加号



有一个包含以下文本的文件:

CXX_FLAGS = -fPIC -Wall -Wextra -Wno-missing-braces -ffloat-store -pthread -std=gnu++17

为了替换字符串"-std=gnu++17";用"-std=c++17-std=gnu++17";,我试过了:

sed -i -e 's/-std=gnu++17/-std=c++17 -std=gnu++17/g' filename

然而,在我删除搜索表达式中frst+符号中的\ escape之前,这是不起作用的。所以这些似乎还可以:

sed -i -e 's/-std=gnu++17/-std=c++17 -std=gnu++17/g' filename
sed -i -e 's/-std=gnu++17/-std=c++17 -std=gnu++17/g' filename
sed -i -e 's/-std=gnu..17/-std=c++17 -std=gnu++17/g' filename

我知道当不在字符类中时,+必须转义,但我认为可以在regex中用反斜杠作为任何字符的前缀。为什么转义此处的+号会导致搜索替换失败?

操作系统是Ubuntu 20.04 LTS。

您既没有使用-r也没有使用-E选项,因此您告诉sed将regex模式解析为POSIX BRE表达式。在GNUsed中,在POSIX BRE表达式中,+是匹配量化模式的一个或多个出现的量词。运行sed -e 's/-std=gnu++17/-std=c++17 -std=gnu++17/g' <<< '-std=gnuuuu17',结果将是-std=c++17 -std=gnu++17。要匹配+,您只需要使用+

请注意,由于在LHS和RHS中都重复了该模式,因此您高估了很多字符,并且您的命令不必要地长。

您可以将以下POSIX BREsed命令与GNUsed:一起使用

sed -i 's/-std=gnu++17/-std=c++17 &/' filename

参见sed在线演示:

s='CXX_FLAGS = -fPIC -Wall -Wextra -Wno-missing-braces -ffloat-store -pthread -std=gnu++17'
sed 's/-std=gnu++17/-std=c++17 &/' <<< "$s"
# => CXX_FLAGS = -fPIC -Wall -Wextra -Wno-missing-braces -ffloat-store -pthread -std=c++17 -std=gnu++17

详细信息

  • -std=gnu++17-字符串模式与-std=gnu++17字符串完全匹配
  • -std=c++17 &-替换模式为-std=c++17,空格和&代表整个匹配,-std=gnu++17

最新更新