如何使用powershell将文本($)替换为文本文件中的引号

Posted

技术标签:

【中文标题】如何使用powershell将文本($)替换为文本文件中的引号【英文标题】:how to replace text ($) with quotation marks in a text file by using powershell 【发布时间】:2022-01-23 08:36:53 【问题描述】:

我正在尝试使用 PowerShell 将文本文件中的文本 ($) 替换为引号

这是我正在尝试的代码,但没有给出预期的结果:

$FilePath = "C:\PT\Test\"
Get-ChildItem $FilePath -Filter *.TXT | ForEach-Object 
(Get-Content $_.FullName) | Foreach-Object 
 $_ -replace  ',"$"', ',"$",'
 | Set-Content $_.FullName
 

【问题讨论】:

应该只需要转义它,尝试:"\$","",或使用将逐字读取所有字符的点网方法:$_.Replace("$","") 【参考方案1】:

正如Abraham 在他的评论中指出的那样,$regex 中的保留字符,称为Anchor,如果您想使用@987654327 匹配文字$ @你需要escape it:\$:

Get-ChildItem $FilePath -Filter *.TXT | ForEach-Object 
    (Get-Content $_.FullName -Raw) -replace ',"\$"',',"$",' |
    Set-Content $_.FullName

另一种选择是使用.Replace(..) 字符串方法,该方法将匹配文字字符。

Get-ChildItem $FilePath -Filter *.TXT | ForEach-Object 
    (Get-Content $_.FullName -Raw).Replace(',"$"',',"$",') |
    Set-Content $_.FullName

通过查看您的代码,您似乎想用,"$", 替换,"$",如果不是这样,请告诉我。

【讨论】:

【参考方案2】:

-replace operator:

使用regex 作为搜索模式 操作数,因此需要逐字 $转义为 \$ 以便这样解释(未转义的$ 是一个正则表达式元字符,表示输入字符串的结尾

还在替换操作数中使用$作为元字符,即引用正则表达式捕获的文本($&)或其部分(例如$1 指第一个捕获组 ((...)) 捕获的内容。在这种情况下,将其转义为 $$

注意:在某些情况下,即使是 未转义 $ 也可以工作,即如果与后续字符组合(如果有)不能解释为占位符,例如 $& 或 @ 987654336@。但是,为了健壮性,最好避开。

因此,使用:

PS> ',"$"20' -replace ',"\$"', ',"$$",'
,"$",20

退后一步:

正如Abraham Zinala 建议的那样,对于逐字 字符串替换.Replace() 字符串方法 就足够了,它的使用不需要转义,并且启动速度更快:

PS> ',"$"20'.Replace(',"$"', ',"$",')
,"$",20

警告:与-replace 不同,.Replace() 区分大小写 - 总是 >Windows PowerShell默认情况下PowerShell (Core) 7+ 中。

查看this answer 了解-replace.Replace() 的详细并列,包括如何对-replace 执行转义以编程方式


将所有内容放在一起进行优化完整读取每个文件,并使用Get-Content -Raw,以加快处理速度(为避免附加尾随换行符,-NoNewLineSet-Content 一起使用):

$FilePath = "C:\PT\Test"
Get-ChildItem $FilePath -Filter *.TXT | ForEach-Object 
  (Get-Content -Raw $_.FullName).Replace(',"$"', ',"$",') | 
    Set-Content -NoNewLine $_.FullName

【讨论】:

以上是关于如何使用powershell将文本($)替换为文本文件中的引号的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell5。查找/替换文本。 Switch和.NET框架或cmdlet和管道?哪个更快?哪个更容易阅读?

Powershell:如何将字符串中的第一个“:”替换为“,”?

如何使用Windows命令行环境查找和替换文件中的文本?

如何在PowerShell中使用运算符'-replace'来替换具有特殊字符的文本字符串并成功替换

将名称替换为第一个字母powershell

powershell Xml替换节点文本