有一个包含以下文本的文件:
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