2017-07-24 39 views
1

我工作的PowerShell腳本和我有我需要更換反斜槓線,這種模式相匹配的幾個文本文件:.. >\\%name% .. < ....可以是任何東西)選擇兩個字符之間所有的反斜線

示例串從文件中的一個,其中反斜槓應該匹配:從所述文件中的一個

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

實施例的字符串,其中反斜槓不應匹配:

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

到目前爲止,我已經成功地選擇>\\%name%<之間的每一個字符用這個表達式(Regex101): (?<=>\\\\%name%)(.*)(?=<) 但我失敗了只選擇反斜線。

有沒有我找不到的解決方案?

+0

我不是100%,但在正則表達式中這可能是不可能的。您的問題與[this]類似(https://stackoverflow.com/questions/3200467/how-to-make-a-group-for-each-word-in-a-tencetence)問題。我沒有看到如何多次使用組捕獲每個反斜槓,而不捕獲它們之間的文本。 –

回答

2

我建議選擇XPath expression的相關標籤,然後在所選節點的文本主體上進行替換。

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

這幫我找到了解決方案,謝謝! – Tinnitus

0

因此,這裏是我的解決方案:

$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每\用/在給定的模式,但不是在我的問題是關於方法。

相關問題