【问题标题】:Replace characters with incrementing value用递增值替换字符
【发布时间】:2018-08-06 13:08:30
【问题描述】:

我试图弄清楚如何用递增值替换 txt 文件中重复多次的某个字符串。

我试图实现的目标如下:

我在一个表格中有多个 HTML 链接,每个链接都有完全相同的结尾,即:XYZ

我想使用 PowerShell 将 XYZ 更改为 1、2、3、4、5 等等。

(Get-Content c:\temp\test.txt).replace('XYZ', 'MyValue') |
    Set-Content c:\temp\test.txt

这是为每个替换使用递增数字的“MyValue”部分,我不知道如何实现它。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    提示:由于possible data loss,请注意在同一文件中使用Get-Content | .... | Set-Content!它不适用于在子表达式/分组表达式中读取文件,但请在将来注意它(作为最佳实践)。感谢 @Ansgar Wiechers 澄清。


    解决方案:

    你可以给[Regex]::Replace (String, String, MatchEvaluator)方法定义回调函数:

    $global:counter = 0
    $content = (Get-Content c:\temp\test.txt)
    
    # Below can be used to verify it's working correctly instead of creating a file
    # $content = "aXYZ","bXYZ","cXYZ","dXYZ","eXYZ"
    
    $content | % {[Regex]::Replace($_, 'XYZ', {return $global:counter += 1}) } | Set-Content c:\temp\test.txt
    

    输出将是:

    a1
    b2
    c3
    d4
    e5
    

    说明:

    你传递给Replace的参数如下:

    1. 搜索匹配的字符串。
    2. 要匹配的正则表达式模式。
    3. 一种自定义方法,用于检查每个匹配项并返回原始匹配字符串或替换字符串。

    每次匹配正则表达式时,自定义方法都会增加计数器。不幸的是,由于某种原因,它要求您使用全局变量范围,如果不需要,这通常不是最佳实践(如 cmets 中的 @Paxz 所述)。

    正如@TessellatingHeckler 发现的那样,第一个版本的解决方案在$content 变量上使用了Replace,这导致删除了所有换行符。您必须使用Foreach-Object(或% 作为其别名)在每一行中进行替换。

    【讨论】:

    • 没有global 范围也可以达到同样的效果。在没有明确需要的情况下使用全局范围是一种不好的做法。
    • 是的,我测试错了,看来我真的需要另一个范围(这有点让我难过...)。
    • 输出不正确,您已将所有带有空格的行隐式连接到一个字符串中。现在文件没有换行符了。
    • 不客气!请记住将帮助您的答案标记为已接受(请参阅What should I do when someone answers my question?
    • 如果您像 OP 那样在子表达式/分组表达式中读取文件,则写入同一个文件不是问题。
    【解决方案2】:

    与@robdy 答案相同,但没有global 范围引用:

    # Simulation of Get-Content
    $content = "aXYZ","bXYZ","cXYZ","dXYZ","eXYZ"
    
    $i = 0
    $result = $content.ForEach({
        $i++
        $_ -replace 'XYZ', $i
    })
    
    $result | Out-File -FilePath "$env:TEMP\test.txt" -Encoding utf8 -NoClobber
    

    我们基本上是循环遍历文件的内容并将字符串XYZ 替换为数字。然后我们将其保存到一个新变量中,稍后用于将新内容写入文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 2014-08-11
      • 1970-01-01
      • 2015-11-03
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多