如何仅在 powershell 的子字符串中替换特定字符

How can I replace specifc characters only within a substring in powershell

我正在尝试处理一个以逗号分隔的文件。在该文件中,其中一个字段包含逗号。我无法控制文件的输出,但包含逗号的字段很方便地用大括号括起来。我需要在 Powershell (v3) 中找到一种方法来替换仅存在于大括号之间的逗号。我试过 split/replace 和 RegEx 都无济于事。

以下是数据示例:

"email@emailaddress.com","Text-exists-here()","","123456789","11/01/2015","{"ProblemSpot":"","SubstringField1":"Related Text","SubstringField2":"","SubstringFieldn":"MoreRelatedText"}","MoreData","LastField",

我想要的是这样的输出:

"email@emailaddress.com","Text-exists-here()","","123456789","11/01/2015","{"ProblemSpot":""~"SubstringField1":"Related Text"~"SubstringField2":""~"SubstringFieldn":"MoreRelatedText"}","MoreData","LastField",

我试过正则表达式:

(gc $file) | -replace "\{.+?(,+?).+\}", "|" | set-content $file

我已经尝试了一个相当长的、丑陋的、被黑客攻击的 split/replace/join 解决方案,它适用于 Powershell v4,但不适用于 v3。如果可能的话,我想要一个 simple/clean 解决方案来在子字符串中进行替换。

一个选项:

$text = 
'"email@emailaddress.com","Text-exists-here()","","123456789","11/01/2015","{"ProblemSpot":"","SubstringField1":"Related Text","SubstringField2":"","SubstringFieldn":"MoreRelatedText"}","MoreData","LastField",'

$parts = $text.split('{}')

"$($parts[0]){$($parts[1].replace(',','~'))}$($parts[2])"

"email@emailaddress.com","Text-exists-here()","","123456789","11/01/2015","{"ProblemSpot":""~"SubstringField1":"Related Text"~"Substri
ngField2":""~"SubstringFieldn":"MoreRelatedText"}","MoreData","LastField",

这将在大括号处拆分行,这样您就可以隔离需要进行替换的部分,进行替换,然后重新assemble 恢复大括号。没有正则表达式,只有简单的文字文本操作。

在 .NET 正则表达式中,您可以使用可变宽度的后视和前视:

(?<="{[^{}]*),(?=[^{}]*}")

参见 regex demo(替换为 ~ 或您选择的任何其他字符)

正则表达式匹配任何 , 前面有 "{,然后是除 {} 之外的任何数量的字符,然后是任何数字{} 以外的字符,最多 }".

您可以使用的另一个正则表达式:

,(?=[^{}]*})

这将匹配任何逗号后跟除 {} 之外的任意数量的字符,最多 }.