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

时间:2017-03-16 16:08:34

标签: powershell csv email dns

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

Input.csv
john@email.com
albert@mail.co.uk
al@hotmail.nl
commadore@gmail.al

应该导致:

Output.csv
约翰@电子邮件
阿尔伯特@邮件
人@ 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
约翰@电子邮件
bert @ mail - ( al 被删除)
人@ hotmail的
madore @gmail - ( com 被删除)

有人能帮忙吗?

2 个答案:

答案 0 :(得分:2)

-replace函数使用正则表达式。在RegEx中,点表示除换行符之外的任何字符。你只需要用\来逃避你的点点就可以了。

像这样:

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

} | Set-Content $Output

根据@ gvee的评论,即使提供了$,添加行尾锚some.alternate@emailaddress.com也应该会有效。

答案 1 :(得分:0)

正如Fairy所指出的,你需要了解你的正则表达式元字符,如DELETE FROM Aircraft a WHERE EXISTS ( SELECT * FROM Aircraft x WHERE x.flight_id = a.flight_id AND x.latitude = a.latitude AND x.longitude = a.longitude AND x.altitude = a.altitude AND x.call_sign = a.call_sign AND x.measurement_time = a.measurement_time AND x.id < a.id ) ;

  

我想删除所有域名扩展名。

如果是这种情况,那么您不需要输入要删除的每一个。您应该能够在包括最后一个句号之后删除所有字符。

由于.是一个数组运算符,因此您 需要使用-replace

ForEach-Object

这将匹配&#34; @&#34;之后的所有内容。它仅用&#34; @&#34;取而代之。什么是在第一个时期之前。

如果你真的想要替换某些域,那么最好保留一个字符串数组并用它构建一个正则表达式替换字符串。使更改更容易,代码将保持清洁。

(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

因此它使用了一个带有元字符转义的交替组。