如何使用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
,以加快处理速度(为避免附加尾随换行符,-NoNewLine
与Set-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:如何将字符串中的第一个“:”替换为“,”?