我有这个电子邮件地址列表
我想删除所有域名扩展名。
的 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 被删除)
有人能帮忙吗?
答案 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
因此它使用了一个带有元字符转义的交替组。