微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

转义加上sed正则表达式

如何解决转义加上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 +登录删除\转义。所以这些似乎还可以:

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

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

操作系统为Ubuntu 20.04 LTS。

解决方法

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

请注意,您过度转义了许多字符,并且您的命令不必要地冗长,因为您在LHS和RHS中都重复了该模式。

您可以对GNU sed使用以下POSIX BRE sed命令:

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

请参见sed online demo

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。