使用PHP
我想比较两个文本文件,第一个文件是另一个应该与之比较的主文件。
如果first.txt
中的second.txt
行不存在或与其不同,则脚本应返回该行的整个块,例如:
first.txt
interface Vlan11
description xxx
ip address 10.10.10.10 255.255.255.255
shutdown
!
vlan 34
!
vlan 17
name sth
!
route-map sth
match ip address exm
set ip next-hop 1.2.3.4
!
second.txt
interface Vlan11
description xxx
ip address 20.20.20.20 255.255.255.255
shutdown
!
vlan 34
!
route-map sth
match ip address exm
set ip next-hop 1.2.3.4
!
对于比较,我使用first.txt
提取file()
行并在second.txt
中搜索它们,现在second.txt
的第三行的IP地址不同,然后我们应该返回此行的块(从interface
到爆炸(!
)):
interface Vlan11
description xxx
ip address 20.20.20.20 255.255.255.255
shutdown
!
或second.txt
个vlan
块之一不存在,因此应返回:
vlan 17
name sth
!
很容易编写一个正则表达式来提取两个刘海之间的块,但是因为我应该回到块的开头,我不知道该模式应该从哪个开始。
另外我还有另外一个想法,即每个块都以一个字符开头,然后是一些以空格开头然后在一端开始爆炸的行,但问题在于如何启动模式。
答案 0 :(得分:0)
这是查找由'!'分隔的两个文件的常见和唯一部分的一种方法。
<?php
$first_txt = "interface Vlan11
description xxx
ip address 10.10.10.10 255.255.255.255
shutdown
!
vlan 34
!
vlan 17
name sth
!
route-map sth
match ip address exm
set ip next-hop 1.2.3.4
!
";
$second_txt = "interface Vlan11
description xxx
ip address 20.20.20.20 255.255.255.255
shutdown
!
vlan 34
!
route-map sth
match ip address exm
set ip next-hop 1.2.3.4
!
";
$first_parts=explode('!',$first_txt);
$second_parts=explode('!',$second_txt);
print_r($first_parts);
print_r($second_parts);
foreach ( $first_parts as $part)
{
if ( in_array( $part, $second_parts ) )
{
echo "found in second_parts $part";
echo "";
}
else
{
echo "not found in second_parts $part";
echo "";
}
}
foreach ( $second_parts as $part)
{
if ( in_array( $part, $first_parts ) )
{
echo "found in first_parts $part";
echo "";
}
else
{
echo "not found in first_parts $part";
echo "";
}
}
答案 1 :(得分:0)
您可以使用以下正则表达式来匹配块:
[Service]
Environment="SECRET_KEY=secret-key-string"
/.*?\R!\R*/s
匹配换行符,而\R
修饰符可确保s
也匹配换行符。
然后,您可以使用.
从文本中获取所有块,并使用preg_match_all
进行比较并提取不同的块:
array_diff
查看它在eval.in;
上运行