假设我有一个名为 testfile.txt 的测试文件,其中包含以下行:
one (two) "three"
我想用 PowerShell 来表示,如果整个字符串存在,则在其下方直接放置一行值:
four (five) "six"
(请注意,它包括空格、括号和双引号。这很重要,因为我遇到的问题是我认为转义括号和双引号)。
所以结果是:
one (two) "three"
four (five) "six"
我认为最简单的方法是说,如果找到第一个字符串,则再次将其替换为第一个字符串本身,并且新字符串形成包含在同一命令中的新行。我很难将字符串排成一行,因此我尝试使用 herestring 变量,从而读取具有格式的整个文本块。它仍然不会将带有引号的完整字符串解析到管道中。我是 powershell 新手,所以如果你看到一些愚蠢的东西,请不要退缩。
$herestring1 = @"
one (two) "three"
"@
$herestring2 = @"
one (two) "three"
four (five) "six"
"@
if((Get-Content testfile.txt) | select-string $herestring1) {
"Match found - replacing string"
(Get-Content testfile.txt) | ForEach-Object { $_ -replace $herestring1,$herestring2 } | Set-Content ./testfile.txt
"Replaced string successfully"
}
else {
"No match found"}
以上只是每次都给出“未找到匹配项”。这是因为它没有找到文件中的第一个字符串。我尝试过使用反引号 [ ` ] 和双引号来尝试转义的变体,但我认为此处字符串中的要点是它应该解析包括所有格式的文本块,所以我不应该这样做。
如果我将文件更改为仅包含:
one two three
然后将此处的字符串相应地更改为:
$herestring1 = @"
one two three
"@
$herestring2 = @"
one two three
four five six
"@
然后它可以正常工作,我可以根据需要替换字符串。