次のリストがあります。
[email protected]
[email protected]
[email protected]
...
ユーザー名部分に現れる点を変えたいです。する:
[email protected]
になる:
user^[email protected]
sedを試しましたが、ユーザー名部分にのみ変更を適用するために正規表現をまとめることはできませんでした。これをするつもりはありますか?
答え1
使用awk
:
awk -F"@" '{gsub("\.","^",$1)}OFS="@"' file
-F"@"
別途入力@
。gsub()
^
最初のフィールド$1
(名前の前の部分)のすべての点を置き換えます@
。OFS
出力フィールドの区切り記号を設定します。
答え2
複数の点がありますが、@記号(通常の場合)の後に1つの点しかない場合は、すべての点を変更して最後の点を再度変更できます。
sed 'y/./^/;s/\(@.*\)\^/\1./'
@シンボルの前後に複数の点がある場合は、短いループを使用してこれを再帰的に実行できます。
sed ':top;s/\.\(.*@\)/^\1/;ttop'
これはGNU sedで動作します。 BSD sed にはラベルの後に改行文字が必要です。
sed ':top
s/\.\(.*@\)/^\1/;ttop'
編集する:1行コマンドでGNU sedまたはBSD sedのすべてのケースを処理するには、次のようにします。
sed 'h;s/@.*//;y/./^/;G;s/\n.*@/@/'
h
現在の行(「パターンスペース」と呼ばれる)を予約済みスペースにコピーします。このs
コマンドは、シェルコマンドと同様に@
すべてを削除します。この場合、すべての点をカラットに変換します。パターンスペースに追加します。 ;最後のコマンドは改行文字からすべての内容を削除して再挿入します。y
tr
G
s
@
@
答え3
ポイントが1つだけあれば使用できます。
sed 's/\.\(.*\)@/^\1@/'
ポイントをマッチさせ、残りをキャプチャし、まで@
置き換えて^
キャプチャします@
。
答え4
sedとawkを持つシステムには通常Perlもあります。 Perl ソリューションを使用する場合は、次を試してください。
perl -ne '($user, $domain) = split "@"; $user =~ s/\./^/g; print "$user\@$domain"'
あなたのEメールアドレスがかなり平凡で、1行に1つのアドレスしか含まれていない場合(他に何もありません)、簡単な方法でこれを行うことができます。住所をで分割し、@
最初の部分のすべてのピリオドをカラットに変更し、2つの部分を置き換えます。部品を電子メールアドレスで一緒に印刷します。
難しいので、次のこともできます。
perl -pe 's/\.(?=.*@)/^/g'
@
正規表現を使用して、記号の前のピリオドをカラットに置き換えます。私が知っている限り、これはsedまたはawkの正規表現バージョンでまだ実装されていない機能である予測アサーションに依存します。長いリストの場合は速度が遅くなる可能性があると思いますが、独自のテストを実行し、それが重要であることを確認してください。