如何解决转义加上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 举报,一经查实,本站将立刻删除。