Hauge.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)正規表現
基本正規表現と拡張正規表現は、パターンを指定する構文の2つのバリエーションです。 BRE(基本正規表現)構文は、sed(およびgrepでも同様)の基本構文です。拡張正規表現 (ERE) 構文を有効にするには、POSIX 指定の -E オプション (-r, --regexp-extended) を使用します。
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
他のユーティリティと同様に、コマンドsed
の最後にファイルを参照するだけです。