Sed

sed - 包含括號時組不匹配

  • May 26, 2022

hoge.txt

tsar@gmail.com
c2m_@hotmail.com.es
c72@hotmail.com.es.com;es
m7_@hotmail.es.com
cm_@hotmail.com
@pepito.com 

沒有組,提取電子郵件工作。

$ cat hoge.txt | sed -nr '/[^@]+@[^.]+\.com$/p'
tsar@gmail.com
cm_@hotmail.com

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

怎麼了?

這個答案集中在 GNU 上sed


在theres的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_

現在您不需要使用catwith sed和其他實用程序,只需在命令末尾引用文件即可。

引用自:https://unix.stackexchange.com/questions/703877