2017-03-16 103 views
0

我收到了这个电子邮件地址列表。
我想删除所有域扩展名。

Input.csv
[email protected]
[email protected]
[email protected]
[email protected]

应导致:
PowerShell:删除电子邮件列表中的域名扩展

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 - (al被删除)
人@ hotmail的
马度尔@ gmail的 - (COM被删除)

任何人能帮助我们吗?

回答

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 

计算的正则表达式的字符串应该是这样的

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

所以它使用了交替组元charaters逃脱。

+0

谢谢! :)超级开心:) – Hogne

2

-replace函数使用正则表达式。在正则表达式中,小数点表示除换行符以外的任何字符。你只需要用\就可以逃脱你的工作。

像这样:

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

} | Set-Content $Output 

按@ GVEE的评论添加结束绳锚$应该让即使[email protected]提供它的工作。

+0

这种方法在多种情况下都不会失败,例如'some.alternate @ emailaddress.com' =>'someternate @ emailaddress' – gvee

+0

是的。复用电子邮件地址非常困难。而且我很确定告诉OP他们正在处理RegEx会将他们指向正确的方向。 – Fairy

+1

@gvee好的,我被制造了。一个简单的'$'应该可以解决你的情况。 – Fairy