sed - 括弧を含むときのグループの不一致

sed - 括弧を含むときのグループの不一致

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の最後にファイルを参照するだけです。

おすすめ記事