Sed
sed - 包含括號時組不匹配
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_
現在您不需要使用
cat
withsed
和其他實用程序,只需在命令末尾引用文件即可。