【问题标题】:how to replace text ($) with quotation marks in a text file by using powershell如何使用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("$","")

标签: powershell powershell-2.0 powershell-3.0 powershell-4.0


【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      相关资源
      最近更新 更多