2017-03-16 10 views
0

この電子メールアドレスのリストがあります。
すべてのドメイン拡張を削除したいと思います。
PowerShell:電子メールリストのドメイン拡張を削除する


[email protected]

[email protected]

Input.csv
[email protected]
[email protected]
が生じるはずです

Output.csv
john @ email
アルバート@メールHotmailの
commadoreする@ gmailの

@
アル私はこのコードを使用している場合...

$Sourcefile = 'C:\PS\Input.csv' 
$Output = 'C:\PS\Output.csv' 

(Get-Content $Sourcefile) | Foreach-Object { 
$_ -replace '.com', ''` 
    -replace '.co.uk', ''` 
    -replace '.nl', ''` 
    -replace '.al', '' 

} | Set-Content $Output 


..私は得る:

Output.csv
john @ email
bert @ mail - (,が削除されます)hotmailの
madoreする@ gmailの@
アル - (コムが削除された)を支援することができ

誰ですか?

答えて

0

妖精が指摘するように、あなたは私がすべてのドメイン拡張子を削除したい.

のようなあなたの正規表現のメタ文字を認識する必要があります。

この場合、削除する必要があるそれぞれを入力する必要はありません。あなたは、最後の期間の後、そして最後の期間を含むすべての文字を削除することができます。-replace以来

はないは、「@」を含む後、すべてを一致しますForEach-Object

(Get-Content $Sourcefile) -replace "(@.+?)\..*$",'$1' | Set-Content $Output 

を使用するを必要とするあなたは配列演算子です。それは "@"だけで置き換えられ、最初の期間の前には何が置き換えられます。

実際に特定のドメインを置き換える場合は、文字列配列を保持し、その正規表現置換文字列を作成する方がよい場合があります。変更を加えるのが簡単になり、コードはきれいに保たれます。

$suffixesToRemove = "com","co.uk","nl","al" 
$regex = "\.($(($suffixesToRemove|ForEach-Object{[regex]::Escape($_)}) -join "|"))$" 
(Get-Content $Sourcefile) -replace $regex | Set-Content $Output 

計算された正規表現の文字列は、だから、エスケープメタcharatersとの交代群を使用しています。この

\.(com|co\.uk|nl|al)$ 

ようになります。

+0

ありがとう! :)超幸せ:) – Hogne

2

-replace関数は正規表現を使用します。正規表現では、ドットは改行を除く任意の文字のを意味します。それを機能させるには、ドットを\でエスケープするだけです。このよう

:@のgveeさんのコメントを1として

(Get-Content $Sourcefile) | Foreach-Object { 
$_ -replace '\.com$', ''` 
    -replace '\.co\.uk$', ''` 
    -replace '\.nl$', ''` 
    -replace '\.al$', '' 

} | Set-Content $Output 

は、行末アンカー$[email protected]が供給されている場合でも、それを動作させる必要があります追加します。

+0

このアプローチは、多くのシナリオで失敗しません。 'some.alternate @ emailaddress.com' =>' someternate @ emailaddress' – gvee

+0

はい、そうです。電子メールアドレスを正規表現するのは難しいことです。そして、私は、彼らがRegExを扱っていることをOPに伝えれば、正しい方向に彼らを指し示すだろうと確信しています。 – Fairy

+1

@gveeよく私はぼんやりした。シンプルな '$'はあなたのシナリオを修正するはずです。 – Fairy

関連する問題