sed PCRE 和POSIX 对括号处理不一样
时间: 2024-02-05 20:05:00 浏览: 20
是的,sed 在处理正则表达式中的括号时,PCRE 和 POSIX 引擎的行为是不同的。
在 POSIX 引擎中,括号通常用于捕获子表达式,并可以在后续命令中通过 \1、\2 等方式来引用这些子表达式。而在 PCRE 引擎中,括号不仅可以用于捕获子表达式,还可以用于分组、非捕获分组、后向引用等。
举个例子,假设有以下字符串:
```
hello, world!
```
如果要使用 POSIX 引擎来捕获字符串中的 hello,可以使用以下命令:
```
echo "hello, world!" | sed 's/\(hello\)/\1/g'
```
在上述命令中,括号 () 用于捕获子表达式 hello,\1 表示引用第一个捕获的子表达式。
而如果要使用 PCRE 引擎来捕获字符串中的 hello,则可以使用以下命令:
```
echo "hello, world!" | sed -r 's/(hello)/\1/g'
```
在上述命令中,括号 () 同样用于捕获子表达式 hello,\1 表示引用第一个捕获的子表达式。与 POSIX 引擎不同的是,PCRE 引擎中的括号还可以用于分组、非捕获分组、后向引用等,因此在使用 PCRE 引擎时需要注意区别。
相关问题
sed 指定 PCRE
在 sed 中,如果需要使用 PCRE 引擎,可以使用 -r 或 -E 选项来指定。
例如,以下命令使用 PCRE 引擎替换字符串:
```
echo "hello, world!" | sed -r 's/hello/hi/g'
```
在上述命令中,-r 选项告诉 sed 使用 PCRE 引擎,s/hello/hi/g 表示使用正则表达式将字符串中的 hello 替换为 hi。
另外,还可以使用 s///2、s///3 等形式的替换命令来指定使用 PCRE 引擎,例如:
```
echo "hello, world!" | sed 's/hello/hi/2'
```
在上述命令中,s/hello/hi/2 表示只替换第二个匹配的 hello。
sed替换中括号中的数字
可以使用sed命令中的正则表达式来匹配中括号中的数字,并进行替换。例如,假设要将字符串中的[123]替换为[456],可以使用以下命令:
```
echo "hello [123] world" | sed 's/\[[0-9]\+\]/[456]/g'
```
其中,正则表达式`\[[0-9]\+\]`匹配中括号中的数字,`\+`表示至少匹配一次数字。替换命令`s/\[[0-9]\+\]/[456]/g`将匹配到的数字替换为[456]。最终输出为:
```
hello [456] world
```
注意,在使用sed命令时需要注意转义字符的使用,以及正则表达式的正确性。