【问题标题】:Select all backslashes between two chars选择两个字符之间的所有反斜杠
【发布时间】:2017-12-29 19:29:57
【问题描述】:

我正在编写一个 powershell 脚本,我有几个文本文件需要替换与此模式匹配的行中的反斜杠:.. >\\%name% .. < .... 可以是任何东西)

反斜杠应该匹配的文件之一的示例字符串:

<Tag>\\%name%\TST$\Program\1.0\000\Program.msi</Tag>

反斜杠不应匹配的文件之一的示例字符串:

<Tag>/i /L*V "%TST%\filename.log" /quiet /norestart</Tag>

到目前为止,我已经设法使用此表达式 (Regex101) 选择了 &gt;\\%name%&lt; 之间的每个字符: (?&lt;=&gt;\\\\%name%)(.*)(?=&lt;) 但我没有只选择反斜杠。

有没有我还没有找到的解决方案?

【问题讨论】:

  • 我不是 100%,但这在正则表达式中可能是不可能的。您的问题类似于this 问题。我不明白如何使用组多次捕获每个反斜杠,而不捕获它们之间的文本。

标签: regex powershell


【解决方案1】:

我建议选择带有XPath expression 的相关标签,然后在所选节点的文本正文上进行替换。

$xml.SelectNodes('//Tag[substring(., 1, 8) = "\\%name%"]' | ForEach-Object {
    $_.'#text' = $_.'#text' -replace '\\', '\\'
}

【讨论】:

    【解决方案2】:

    所以这是我的解决方案:

    $original_file = $Filepath
    $destination_file =  $Filepath + ".new"
    
    Get-Content -Path $original_file | ForEach-Object { 
        $line = $_
        if ($line -match '(?<=>\\\\%name%)(.*)(?=<)'){
           $line = $line -replace '\\','/'
         }
        $line
    } | Set-Content -Path $destination_file
    Remove-Item $original_file
    Rename-Item $destination_file.ToString() $original_file.ToString()
    

    所以这将replace 每个 \ 在给定的模式中带有 / ,但不是我的问题所涉及的方式。

    【讨论】:

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