2011-07-05 53 views
1

我有一个大的文本文件,我做了一些搜索和提取今天SED的帮助。 我目前的SED scrifp搜索一个patters /串,并提取模式/串到下一个空间中的所有信息。查找字符串,并得到一切从字符串到下一个空间

我刚才discoverd PowerShell和喜欢它。

我曾尝试没有成功复制相同的脚本在PowerShell中。 enyone有一个建议如何做到这一点?从我目前的文本文件(hw.txt)

例子:

i1231 Cisco_1800 *IP=10.10.10.1 *SV=0 *NM=Router_1 *[email protected]_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 

/皮尔

+0

你在翻译的正则表达式的问题是,在'sed'你需要逃避括号将它们从字面括号改变周围捕获的括号(同样用括号和括号,顺便说一句),而不是其他方式在.NET和最其他正则表达式。但是由于PowerShell允许比正则表达式的直接转换更优雅的解决方案,我会将其作为答案发布。 –

回答

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() 
} 
+0

谢谢!所以,它不像一班一样简单。我会试一试。如果我想添加另一种模式来提取,那么它似乎相当容易。 –

+0

对不起,但我无法得到这个工作。我可能会弄错这个方法。我遇到@错误。它找不到'@。??我如何从hw.txt获取信息?获取内容? –

+0

对不起;我让RegexBuddy生成了这个PowerShell代码片段,但我不能说出问题出在哪里。尝试它没有评论:'$ regex = [regex]'\ * IP =(? \ S *)。*?\ * NM =(? \ S *)| \ * NM =(? \ S * )*?\ * IP =(? \ S *)'' - 现在可以工作吗? –

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 
} 
+0

这很简单。谢谢!有什么方法可以在两个组之间得到一个spce? –

+0

我用例子更新了线程 –

+0

谢谢! 是否有可能有脚本来执行,而不是* IP之间的或AND =和* NM =? –

相关问题