使用PowerShell进行复杂查找/替换

时间:2012-07-12 00:37:15

标签: powershell

我想在以下示例中添加html链接:

  1. Blah Blah Blah BZ#01234 Blah Blah Blah
  2. Blah Blah Blah BZ#0124 Blah Blah Blah
  3. Blah Blah Blah BZ 012345 Blah Blah Blah
  4. Blah Complex Blah BZ#123,345,567,2341 Blah
  5. 所以看起来像:

    1. Blah Blah Blah< a href =“http://bz.com/show_bug.cgi?id=01234”> BZ#01234< / a> Blah Blah Blah
    2. Blah Blah Blah< a href =“http://bz.com/show_bug.cgi?id=0124”> BZ#0124< / a> Blah Blah Blah
    3. Blah Blah Blah< a href =“http://bz.com/show_bug.cgi?id=012345”> BZ 012345< / a> Blah Blah Blah
    4. Blah Complex Blah< a href =“http://bz.com/show_bug.cgi?id=123”> BZ#123< / a> ,< a href =“http://bz.com/show_bug.cgi?id=345”> 345< / a&gt ;,< a href =“http://bz.com/show_bug.cgi?id = 567“> 567< / a>,< a href =”http://bz.com/show_bug.cgi?id=2341“> 2341< / a>嗒嗒
    5. 所以我猜这是一个正则表达式的工作,找到匹配,以及一些PowerShell魔术添加HTML链接。我认为正则表达式是((BZ#)|(BZ ))[0-9]+以匹配除复杂示例之外的所有内容,但我不太了解正则表达式,或者如何在PowerShell中测试它。

1 个答案:

答案 0 :(得分:2)

我认为这有效,这取决于输入的变量。

$inputstring = @'
Blah Blah Blah BZ#01234 Blah Blah Blah
Blah Blah Blah BZ#0124 Blah Blah Blah
Blah Blah Blah BZ 012345 Blah Blah Blah
Blah Complex Blah BZ#123 , 345, 567,2341 Blah
'@

# Split the input into an array of strings
$lines = $inputstring -split '[\r\n]'

# Setup patterns to match against
$pattern1 = "(.*)\sBZ#(\d+) , (\d+), (\d+),(\d+) (.*)"
$pattern2 = "(.*)\sBZ#(\d+)\s(.*)"
$pattern3 = "(.*)\sBZ (\d+)\s(.*)"

# Loop through each line
for($i = 0; $i -lt $lines.count; $i++)
{
    # Start off assuming the current line produces no output
    $output = ""

    # Look for volumes with drive letters
    if($lines[$i] -match $pattern1)
    {
        $output = $matches[1] + " <a href=`"http://bz.com/show_bug.cgi?id=" + $matches[2] + "`">BZ#" + $matches[2] + "</a> , " + 
            "<a href=`"http://bz.com/show_bug.cgi?id=" + $matches[3] + "`">" + $matches[3] + "</a>, " + 
            "<a href=`"http://bz.com/show_bug.cgi?id=" + $matches[4] + "`">" + $matches[4] + "</a>," + 
            "<a href=`"http://bz.com/show_bug.cgi?id=" + $matches[5] + "`">" + $matches[5] + "</a> " + 
            $matches[6]
    }
    elseif($lines[$i] -match $pattern2)
    {
        $output = $matches[1] + " <a href=`"http://bz.com/show_bug.cgi?id=" + $matches[2] + "`">BZ#" + $matches[2] + "</a> " + $matches[3]
    }
    elseif($lines[$i] -match $pattern3)
    {
        $output = $matches[1] + " <a href=`"http://bz.com/show_bug.cgi?id=" + $matches[2] + "`">BZ " + $matches[2] + "</a> " + $matches[3]
    }

    # Write out any output that was produced
    if($output -ne "")
    {
        $output
    }
}

输出:

Blah Blah Blah <a href="http://bz.com/show_bug.cgi?id=01234">BZ#01234</a> Blah Blah Blah
Blah Blah Blah <a href="http://bz.com/show_bug.cgi?id=0124">BZ#0124</a> Blah Blah Blah
Blah Blah Blah <a href="http://bz.com/show_bug.cgi?id=012345">BZ 012345</a> Blah Blah Blah
Blah Complex Blah <a href="http://bz.com/show_bug.cgi?id=123">BZ#123</a> , <a href="http://bz.com/show_bug.cgi?id=345">345</a>, <a href="http://bz.com/show_bug.cgi?id=567">567</a>,<a href="http://bz.com/show_bug.cgi?id=2341">2341</a> Blah