我有一个大文本文件,我今天在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
/皮尔
答案 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
}