在批处理或PoSh的引号之间删除逗号

时间:2017-08-24 10:45:04

标签: regex powershell

我有一个包含以下内容的CSV文件:

A,B,C
D,"E,F",G
H,I,"J,K,L"

我需要在引号之间删除逗号(也删除引号,但这不是那么重要):

A,B,C
D,EF,G
H,I,JKL

我查看了PoSh -replace运算符但我无法捕获多个组值:

 PS >"D,`"E,F`",G" -replace "`"((?:[^,`"]+)\,?)+`"", '$1'
 D,F,G

正如您可以看到重复组时,只保留最后捕获的值。有没有办法进行我想要的转换?

https://regex101.com/r/ON1rgp/1/

2 个答案:

答案 0 :(得分:3)

您可以定义一个回调以传递到Regex::Replace方法,您可以在其中抓取引号之间的部分并删除那里的所有,

$callback = {  param($match) $match.Groups[1].Value.Replace(',','') }
$s =  "D,`"E,F`",G"
$rex = [regex]'"([^"]*)"'
$rex.Replace($s, $callback)

enter image description here

正则表达式"([^"]*)"匹配",然后捕获到第1组(即$match.Groups[1].Value)除"以外的任何零个或多个字符,然后匹配{{ 1}}。如果您有转义报价,它将需要增强,但方法将是相同的。

答案 1 :(得分:2)

这是使用正则表达式的替代方法:

Import-Csv your.csv | Foreach-Object { 
    $_.PSObject.Properties | ForEach-Object { $_.Value = $_.Value -replace ',' }
    $_
 } | Export-csv your-new.csv -NoTypeInformation

我们使用Import-CSV将数据导入为PowerShell对象。然后,我们遍历CSV的每一行的每个属性的值,以替换“,”字符。然后我们将其导出为新的CSV。