Найти строку и получить все от строки до следующего пробела - PullRequest
1 голос
/ 05 июля 2011

У меня есть большой текстовый файл, который я сегодня выполняю с помощью SED. Мой текущий сценарий SED ищет шаблоны / строку и извлекает всю информацию из шаблона / строки в следующий пробел.

Я только что обнаружил PowerShell и люблю его.

Я попытался повторить тот же сценарий в powershell, но безуспешно. У enyone есть предложение, как это сделать?

Пример из моего текущего текстового файла (hw.txt):

i1231 Cisco_1800 *IP=10.10.10.1 *SV=0 *NM=Router_1 *CM=remote_router_@site_1
i2385 Cisco_2960 *NM=switch_7 *CM=workstation_switch *IP=192.168.5.97 *SV=1
i8473 Cisco_PIX *IP=10.10.10.9 *SV=0 *NM=PIX_2 *CM=Int_Firewall

Мой текущий скрипт SED для извлечения * IP = и * NM =:

sed -ne "s/^.*\*IP=\([^ ]*\) .*\*NM=\([^ ]*\) .*$/\1 \2/p" -ne "s/^.*\*NM=\([^ ]    *\) .*\*IP=\([^ ]*\) .*$/\2 \1/p" db.tmp > hosts

Результат с этим сценарием будет:

10.10.10.1 Router_1
192.168.5.97 switch_7
10.10.10.9 PIX_2

Я попытался использовать это как простой способ получить правильный синтаксис:

Select-String ".*\*nm=\([^ ]*\)" hw.txt

/ Pierre

Ответы [ 2 ]

0 голосов
/ 05 июля 2011

Как насчет этого:

cat test.txt | select @{n='IP';e={[regex]::match($_,'\*IP=([^\s]+)').Groups[1].Value}},@{n='NM';e={[regex]::match($_,'\*NM=([^\s]+)').Groups[1].Value}}

IP           NM
--           --
10.10.10.1   Router_1
192.168.5.97 switch_7
10.10.10.9   PIX_2

Чтобы вывести значения с пробелом:

cat test.txt | foreach{
    $ip = [regex]::match($_,'\*IP=([^\s]+)').Groups[1].Value
    $nm = [regex]::match($_,'\*NM=([^\s]+)').Groups[1].Value
    "{0} {1}" -f $ip,$nm
}
0 голосов
/ 05 июля 2011

Я бы сделал это так:

Сначала создайте объект регулярного выражения, который найдет текст IP и NM в строке текста, независимо от их порядка.В .NET вы можете использовать именованные группы захвата, поэтому, независимо от того, какая из двух будет первой, соответствующий текст будет находиться в правильной группе захвата:

$regex = [regex] 
    @'
    (?x)\*IP=(?<IP>\S*).*?\*NM=(?<NM>\S*)  # IP first, NM second
    |                                      # or
    \*NM=(?<NM>\S*).*?\*IP=(?<IP>\S*)      # NM first, IP second
    '@

Затем вы можете перебирать текст иизвлечь значения:

$match = $regex.Match($subject)
while ($match.Success) {
    IP = $match.Groups['IP'].Value
    NM = $match.Groups['NM'].Value
    $match = $match.NextMatch()
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...