我对powershell和regex的东西都是全新的,但我需要帮助才能做到以下几点:
我需要在文件中替换'VALUE',因为我知道它之前和之后的字符串。它也可以运行多行。例如:
<knownvalue1>
<knownvalue2>VALUE<knownvalue3>
knownvalue 2和3不是唯一的,所以我需要将knownvalue1作为'标识符'的种类
此外,为了保持与之前相同的格式,它需要遵循:
(gc $filename)-replace "(SEARCHPATTERN)","(REPLACEVAL)" | sc $filename
如果你不能这样做,那么替代方法就可以了。
我对这个疯狂了,所以任何帮助都会很棒。 感谢。
答案 0 :(得分:0)
好吧,当您导入文件并读取行的行时,您可以像这样拆分行:
Bassicly首先我们将它拆分为分隔符>
这样做之后,字符串将分成以下部分:<knownvalue2
和VALUE<knownvalue3
以及(empty)
之后需要再次在>
上拆分,但是现在该字符串是部分的,你需要在部分上拆分它。这让它变得棘手......同时,这是非常肮脏的,至少在我看来......
$value = @()
$value += "<UniqueValue1>"
$value += "<knownvalue2>This Belongs to UniqueValue1<knownvalue3>"
$value += "</UniqueValue1>"
$value += "<UniqueValue2>"
$value += "<knownvalue2>This Belongs to UniqueValue2<knownvalue3>"
$value += "</UniqueValue2>"
[int]$count = 0
foreach($line in $value)
{
if($line.Equals("<UniqueValue1>"))
{
$parts = $value[($count + 1)].Split('>');
"Should be This Belongs to UnqiueValue1<knownvalue3"
$parts[1]
""
"Second Split"
$val = $parts[1].Split('<')
$val[0] + " #should be This belongs to UniqueValue1"
$val[1] + " #should be knownvalue3"
""
"Should be <knownvalue2"
$parts[0]
}
if($line.Equals("<UniqueValue2>"))
{
$parts = $value[($count + 1)].Split('>');
"Should be This belongs to UniqueValue2<knownvalue3"
$parts[1]
""
"Second Split"
$val = $parts[1].Split('<')
$val[0] + " #should be This Belongs to UniqueValue2"
$val[1] + " #should be knownvalue3"
""
"Should be <knownvalue2"
$parts[0]
}
"finished Reading line: $count"
$count++
}
答案 1 :(得分:0)
将文件作为一个字符串读取(gc
输出一个非常差的选择的数组)并使用一个简单的正则表达式:
[IO.File]::ReadAllText($filename) -replace `
'(<knownvalue1>[\s\r\n]*<knownvalue2>)VALUE(<knownvalue3>)',
'$1(REPLACEVAL)$2'
注意:
在PS3.0 +中,您可以使用(gc $filename -raw)
代替[IO.File]::ReadAllText($filename)
如果<knownvalue1>SKIP SOME OTHER TAGS<knownvalue2>
抓住SKIP部分,您可以使用<knownvalue1>(?s).*?<knownvalue2>
来匹配任何字符,包括换行符(CR / LF)。