sed - 包含括号时组不匹配

sed - 包含括号时组不匹配

豪格.txt

[email protected]
[email protected]
[email protected];es
[email protected]
[email protected]
@pepito.com 

如果没有组,提取电子邮件就可以工作。

$ cat hoge.txt | sed -nr '/[^@]+@[^.]+\.com$/p'
[email protected]
[email protected]

cat hoge.txt | sed -nr 's/[^@]+@[^.]+\.com$/hoge/p'
-----
hoge
hoge

但是,无法从包含组的电子邮件中提取用户名部分。

cat hoge.txt | sed -nr 's/\([^@]+\)@[^.]+\.com$/hoge/g'
---
(nothing matches)

cat hoge.txt | sed -nr 's/\([^@]+\)@[^.]+\.com$/\1/p'
-----
sed: -e expression #1, char 28: invalid reference \1 on `s' command's RHS

怎么了?

答案1

这个答案主要针对GNU sed


在里面GNU手册其中sed有关于正则表达式语法和使用的解释:

5.2 基本(BRE)和扩展(ERE)正则表达式

基本正则表达式和扩展正则表达式是指定模式语法的两种变体。基本正则表达式 (BRE) 语法是 sed 中的默认语法(grep 中也类似)。使用 POSIX 指定的 -E 选项(-r、--regexp-extended)启用扩展正则表达式 (ERE) 语法。

在 GNU sed 中,基本正则表达式和扩展正则表达式之间的唯一区别在于一些特殊字符的行为:“?”、“+”、括号、大括号 (“{}”) 和“|”。

对于基本 (BRE) 语法,这些字符没有特殊含义,除非以反斜杠 ('\') 为前缀;而使用扩展 (ERE) 语法则相反:这些字符是特殊的,除非它们以反斜杠 ('\') 为前缀。

因此,根据您使用的是 BRE 还是 ERE,您必须调整语法以获得所需的结果:

布雷:

$ sed -n 's/\([^@]\+\)@[^.]\+\.com$/\1/p' hoge.txt
tsar
cm_

紧急情况:

$ sed -nE 's/([^@]+)@[^.]+\.com$/\1/p' hoge.txt
tsar
cm_

现在你不需要使用catsed其他实用程序一样,只需在命令末尾引用该文件即可。

相关内容