找到一个字符串,从字符串到下一个空格

时间:2011-07-05 06:57:23

标签: select powershell sed

我有一个大文本文件,我今天在SED的帮助下进行搜索和提取。 我当前的SED scrifp搜索patters / string,并将模式/字符串中的所有信息提取到下一个空格。

我刚刚发现了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

/皮尔

2 个答案:

答案 0 :(得分:0)

我会这样做:

首先,创建一个正则表达式对象,它将在一行文本中找到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()
} 

答案 1 :(得分:0)

这个怎么样:

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
}