在Powershell中用多行替换已知字符串之间的字符串

时间:2016-11-07 20:08:23

标签: regex powershell

我对powershell和regex的东西都是全新的,但我需要帮助才能做到以下几点:

我需要在文件中替换'VALUE',因为我知道它之前和之后的字符串。它也可以运行多行。例如:

<knownvalue1>
<knownvalue2>VALUE<knownvalue3>

knownvalue 2和3不是唯一的,所以我需要将knownvalue1作为'标识符'的种类

此外,为了保持与之前相同的格式,它需要遵循:

(gc $filename)-replace "(SEARCHPATTERN)","(REPLACEVAL)" | sc $filename

如果你不能这样做,那么替代方法就可以了。

我对这个疯狂了,所以任何帮助都会很棒。 感谢。

2 个答案:

答案 0 :(得分:0)

好吧,当您导入文件并读取行的行时,您可以像这样拆分行:

Bassicly首先我们将它拆分为分隔符>这样做之后,字符串将分成以下部分:<knownvalue2VALUE<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)。