2016-11-29 9 views
0

PowerShellを使用して.txtファイル内の複数行から特定の値を抽出しようとしています。私は現在、複数の置換を使用してcmdを削除しますが、期待通りに機能せず、やや複雑です。 もっと簡単な方法がありますか?PowerShellで.txtファイルの文字列から特定の値を抽出します。

マイスクリプト:

$file = Get-Content "C:\RS232_COM2*" 

foreach($line in $file){ 
$result1 = $file.replace(" <<< [NAK]#99","") 
$result2 = $result1.remove(0,3) #this only works for the first line for some reason... 
$result3 = $result2.replace("\(([^\)]+)\)", "") #this should remove the string within paranthesis but doesn't work 

.txtファイル:

29 09:10:16.874 (0133563471) <<< [NAK]#99[CAR]0998006798[CAR] 
29 09:10:57.048 (0133603644) <<< [NAK]#99[CAR]0998019022[CAR] 
29 09:59:56.276 (0136542798) <<< [NAK]#99[CAR]0998016987[CAR] 
29 10:05:36.728 (0136883233) <<< [NAK]#99[CAR]0998050310[CAR] 
29 10:55:36.792 (0139883179) <<< [NAK]#99[CAR]099805241D[CAR]0998028452[CAR] 
29 11:32:16.737 (0142083132) <<< [NAK]#99[CAR]0998050289[CAR]0998031483[CAR] 
29 11:34:16.170 (0142202566) <<< [NAK]#99[CAR]0998034787[CAR] 
29 12:01:56.317 (0143862644) <<< [NAK]#99[CAR]0998005147[CAR] 

私は期待出力:

09:10:16.874 [CAR]0998006798[CAR] 
09:10:57.048 [CAR]0998019022[CAR] 
09:59:56.276 [CAR]0998016987[CAR] 
10:05:36.728 [CAR]0998050310[CAR] 
10:55:36.792 [CAR]099805241D[CAR]0998028452[CAR] 
11:32:16.737 [CAR]0998050289[CAR]0998031483[CAR] 
11:34:16.170 [CAR]0998034787[CAR] 
12:01:56.317 [CAR]0998005147[CAR] 
+0

$ result1 = $ file.replace' - > '$ result1 = $ line.replace' –

答えて

1

以上の単純な:

$Array = @() 
foreach ($line in $file) 
{ 
$Array += $line -replace '^..\s' -replace '\s\(.*\)' -replace '<<<.*#\d+' 
} 
$Array 
1

複数の問題。

$lineではなく、$fileを参照してください。最後の操作では、正規表現パターンでString.Replace()メソッドを使用している - この方法は理解していない何か - 代わり-replace演算子を使用する:

$file = Get-Content "C:\RS232_COM2*" 

foreach($line in $file){ 
    $line = $line.Replace(" <<< [NAK]#99","") 
    $line = $line.Remove(0,3) 

    # now use the -replace operator and output the result 
    $line -replace "\(([^\)]+)\)","" 
} 

あなたが1個の正規表現の置換でそれをすべて行うことができます:

$line -replace '\(\d{10}\)\ <<<\s+\[NAK]\#99','' 
+0

ありがとうございました。理解しやすく、説明が簡単です。 –

1

別のオプションは、あなたが1つの正規表現で必要なラインの一部を取得し、それらをCONCATすることです:

$input_path = 'c:\data\in.txt' 
$output_file = 'c:\data\out.txt' 
$regex = '(\d+(?::\d+)+\.\d+).*?\[NAK]#99(.*)' 
select-string -Path $input_path -Pattern $regex -AllMatches | % { $_.Matches } | % { [string]::Format("{0} {1}", $_.Groups[1].Value, $_.Groups[2].Value) } > $output_file 

正規表現1桁以上の数字は.、その後、:と1桁以上の数字の1+配列と続き、: - グループ1

  • (\d+(?::\d+)+\.\d+)

    (\d+(?::\d+)+\.\d+).*?\[NAK]#99(.*) 
    

    regex demo

    詳細を参照してくださいされます再び1桁以上

  • .*?\[NAK]#99 - 可能な限り少ない改行以外の任意の0個の文字最初[NAK]#99リテラル文字列
  • (.*)に - グループ2:行の残り

我々はすべての一致を取得した後、$_.Groups[2].Valueと連結$_.Groups[1].Valueは、期待される出力が得られます。

関連する問題