2017-12-02 2 views
2

こんにちは、私はPowershellのほぼ初心者です。 テキストファイル内の特定の行を読み込んで別の配列に配置する必要があります。 私はこのように見ているファイルがあります:Powershellでtxt-fileの2つの特殊文字の間の行を読み取る方法

[Servers] 
Server1 
Server2 
Server3 
Server4 
[IP] 
10.10.10.10 
10.10.10.20 
10.10.30.30 
192.168.1.2 
192.168.1.4 
[Path] 
C:\Log\*.log 
D:\Files\*.txt 
D:\Files\*.csv 
D:\Files\*.xml 
[Gateway] 
10.10.10.1 
10.10.30.2 
192.168.1.1 

を私の問題は、私は[Servers](時には3行、時には多くの)内の行を読み込み、配列にしてこれらを配置する必要があるということです。 行数がわからないときに、[Servers][IP]の間のすべての行を選択するにはどうすればよいですか?

答えて

0

密接に関連:Grabbing specific sections of a txt file via Powershell

それが最初にメモリにファイル全体を読み取るために許容できるなら:

入力ファイルの名前を受け入れ、単純な 機能にリファクタリング
$regex = '(?ms)\A.*?^\[Servers\]\s*\r?\n(.*?)(?:\r?\n\[.*|(?:\r?\n)?\Z)' 
$servers = (Get-Content -Raw file.txt) -replace $regex, '$1' -split '\r?\n' 

関心のあるセクション:

function get-SectionLines([string] $LiteralPath, [string] $SectionName) { 
    $regex = '(?ms)\A.*?^\[{0}\]\s*\r?\n(.*?)(?:\r?\n\[.*|(?:\r?\n)?\Z)' -f [regex]::Escape($SectionName) 
    (Get-Content -Raw -LiteralPath $LiteralPath) -replace $regex, '$1' -split '\r?\n' 
} 

$servers = get-SectionLines file.txt Servers 

説明

  • Get-Content -Raw単一の文字列としてファイル全体をメモリに読み込みます。
  • -replace次いで関心の行のみを一致捕捉基(...))と、全体入力文字列と一致する正規表現(正規表現)を使用して、その1つの複数行の文字列で動作し、全体を交換単にセクションの行だけを返すキャプチャグループだけの文字列です。
  • 最後に、-split '\r?\n'は、抽出された複数行の文字列を行の配列に分割します。

    • インライン正規表現オプション(?sm)M ultiラインの両方の電源をオンにし、Sイングルラインオプション:

      • 正規表現の

      説明mは、^$ matc入力文字列全体ではなく、各行の先頭と末尾にと入力します。

    • s発現など.*はライン横切っを一致させるために使用することができるように.メタ文字は、あまりに\n文字と一致することを意味します。
  • \Aは、(マルチライン)入力、および\Z最後の非常に開始と一致します。

  • \r?\nは、CRLFとLFの両方の改行に一致します。

  • (.*?)は、セクション内のすべてを(貪欲に)捕捉するキャプチャグループです。

  • (?:\r?\n\[.*|(?:\r?\n)?\Z)部([続く改行)の開始のいずれかであり得る関心のセクション、または終了後にすべてと一致するように、非捕捉基((?:...))を使用し入力ファイル(末尾に改行があってもなくてもかまいません)のいずれかです。正規表現は、全体入力文字列と一致し、そしてその後、第1の(そして唯一の)捕捉基($1)に捕捉関心のちょうどストリング(範囲)に置き換えられていること

  • 注。

0

メソッドの古典:

$found=$false 
$Listword=(gc C:\temp\list.txt).Split("[]".ToCharArray()) 

$Servers=foreach ($item in $Listword) 
{ 
    if ($item -eq "IP") { break } 

    if ($item -eq "Servers") {$found=$true; continue} 

    if ($found) {$item} 
} 

$Servers 
関連する問題