如何仅在 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(替换为 ~
或您选择的任何其他字符)
正则表达式匹配任何 ,
前面有 "{
,然后是除 {
和 }
之外的任何数量的字符,然后是任何数字{
和 }
以外的字符,最多 }"
.
您可以使用的另一个正则表达式:
,(?=[^{}]*})
这将匹配任何逗号后跟除 {
或 }
之外的任意数量的字符,最多 }
.
我正在尝试处理一个以逗号分隔的文件。在该文件中,其中一个字段包含逗号。我无法控制文件的输出,但包含逗号的字段很方便地用大括号括起来。我需要在 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(替换为 ~
或您选择的任何其他字符)
正则表达式匹配任何 ,
前面有 "{
,然后是除 {
和 }
之外的任何数量的字符,然后是任何数字{
和 }
以外的字符,最多 }"
.
您可以使用的另一个正则表达式:
,(?=[^{}]*})
这将匹配任何逗号后跟除 {
或 }
之外的任意数量的字符,最多 }
.