0

次のような内容のファイルがあります。

[Something1Something2]
 - Interesting data 1
 - Interesting data 2

[Something3]
 - Interesting data 1
 - Interesting data 2

[Something4]
 - Interesting data 1
 - Interesting data 2

こぼれたコマンドまたはその他の不明なコマンドを使用して、返されたセクションを取得し、次のようにインデックスを作成したいと思います。

$myStringArray[0]

prints:

 - Interesting data 1
 - Interesting data 2

私は正規表現を使用してこれを達成しようとしましたが、運がありません:

"[Somthing1] somedata1 [Something2] somedate2" -split "\[(.*)\]"

これは上記のように複数行ではありませんが、原則は同じであり、テストのみを目的としています。

上記のファイルでこれを行い、複数行で試してみると:

$myfile = Get-Content .\test.txt
($myfile -split "\[.*\]")

3 つのエントリではなく、14 の配列を取得します。

4

2 に答える 2

0

正規表現のためにこれを試してください:

(?mi)^\[.*\]{1}\s

ファイルをインポートするには、これを試してください:

$myfile = [io.file]::ReadAllText(".\test.txt")

これにより、get-content が返す配列ではなく、単一の値としてファイルがインポートされます。

そこから、これを行うことができるはずです:

[regex]::Split($myfile,"(?mi)^\[.*\]{1}\s")

これにより、分割に検索文字列が含まれなくなります。

検索文字列を含めたい場合は、次のような先読みが必要です。

[regex]::Split($myfile,"(?=(?mi)^\[.*\]{1}\s)")
于 2012-09-26T23:11:09.507 に答える
0

私は解決策を見つけましたが、きれいなものではありません:

Function GetEntriesMatching($filename, $tagMatch)
{
    Write-Host "Filename: $filename"
    Write-Host "Tag: $tagMatch"

    $regex = "\[.*($tagMatch).*\]"
    Write-Host "Regex: $regex"

    $Lines = Get-Content $filename
    $Out = $False
    $returnValue = @()

    ForEach ($Line In $Lines)
    {
        If ($Line -match '\[.*\]') {$Out = $False}
        If ($Out -eq $True) {$returnValue += "<br> $Line </br>"}
        If ($Line -match $regex) {$Out = $True}
    }

    if($returnValue.Count -eq 0)
    {
        $returnValue += "<b>NO ENTRIES FOUND FOR $tagMatch</b>"
    }

    return $returnValue
}

誰かがこれを行うためのよりスマートな方法を持っているなら、私は本当にそれを見たいです:)。

敬具

于 2012-09-26T21:11:08.543 に答える