電子メールアドレスを含むテキストファイルから各行のドメイン部分を削除する方法

電子メールアドレスを含むテキストファイルから各行のドメイン部分を削除する方法

1 行につき 1 つの電子メール アドレスが記載されたテキスト ファイルがあります。各行のドメイン部分を削除し、TLD 部分を削除しないようにするにはどうすればよいでしょうか。ここでは、TLD を最後のドット文字の後の文字列の最後の要素として定義します。

つまり、サンプル入力は次のようになります。

[email protected]
[email protected]
[email protected]
[email protected]

望ましい出力:

foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

答え1

$ sed 's/@.*[.]/@/' file
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

正規表現は、から行の最後のピリオドまでの@.*[.]すべてをキャプチャします。 これを に置き換えます。@.@

答え2

使用perl

perl -pe 's/(@).*\.(.*)$/\1\2/' foo

またはインライン

perl -i -pe 's/(@).*\.(.*)$/\1\2/' foo

$ cat foo
[email protected]
[email protected]
[email protected]
[email protected]

$ perl -pe 's/(@).*\.(.*)$/\1\2/' foo
foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

正規表現の説明

/(@).*\.(.*)$/

  • 第1捕獲グループ(@

    @文字@に文字通り一致する

  • .*任意の文字に一致します(改行を除く)

    量指定子: *0 回から無制限の間、できるだけ何回でも、必要に応じて返す [貪欲]

    \.文字.に文字通り一致する

  • 第2捕獲グループ(.*

    .*任意の文字に一致します(改行を除く)

    量指定子: *0 回から無制限の間、できるだけ何回でも、必要に応じて返す [貪欲]

  • $文字列の末尾の位置をアサートする

正規表現の視覚化

Debuggex デモ

答え3

こうすればawkできる

$awk '{ sub(/\@.*\./,"@"); print }' file


foobar@org
john.smith@com
chunkylover69@dk
qwerty@uk

「置換(検索と置換)」を使用するとsub、パターンを検索して置換することができます。

関連情報