我有一个包含版本名称和版本号的文件。第一个文件的内容显示为 -
File1-
<Line contains the name of product1>
package_name0_9_8 >= 1.2.3x-4.5.6
package_name0_9_8-32bit >= 3.6.1g-3.5.1
package_name0_9_8-xx >= 6.3.2v-3.0.4
<Line contains the name of product2>
anotherpackage_name0_9_8 >= 3.5.6u-3.6.5
和
File2.xml-
<package name="package_name0_9_8" version="1.2.3x-4.4.4"/>
<package name="package_name0_9_8-32bit" version="3.6.1g-3.4.0"/>
.
.
有没有办法用File_name的package_name检查File1中存在的package_name的存在,并检查File1中package_name的相应版本是否与File2的package_name的相应版本相同?
我很坦率地说,我在连接'grep'和'awk'命令以及在这里使用的选项时非常弱。请帮忙。
答案 0 :(得分:0)
sed -n 's².*²s#<package name="\\(&"/>#\\1 Present#p²;s/ *>= */\\)" *version="/p' File1 > /tmp/File1.sed
sed -n -f /tmp/File1.sed File2
rm /tmp/File1.sed
--posix
在GNU sed上\\1 Present
文本的输出消息,其中\\1
将成为包名称(几乎没有修改,也可以使用版本)答案 1 :(得分:0)
看起来你已经有了一个更接近你想要的格式的更短的解决方案。但是,既然我问过Python解决方案是否可行,并且您说是,请查看以下代码:
(我没有对它进行多次调试,但它似乎至少比你的示例文件更多。我将代码发布到公共领域.CC-BY-SA不是软件根据CC的制造商的说法,许可证;所以,这就是我没有在这里发布的原因,因为在这里发布它会给它许可。另外,你会在提供的链接上获得特定于Python的语法高亮。)
基本上,这是一个很复杂的文本解析。没有太多的算法来解释。它获取两个文件的内容,剥离包,它们的版本和操作数(将所有这些放在字典中供以后使用),并循环遍历另一个文件的行并比较版本;然后它告诉你哪些匹配,哪些不匹配。
答案 2 :(得分:0)
for a in $(sed -n '/>=/p' File1.txt | grep -o '^[^ ]*'); do for b in $(sed -n "/^$a /{s/.*>=\(.*\)$/\1/p}" File1.txt); do ((! $(grep -c "$a.*$b" File2.txt))) && (echo "$a $b" >> missing_pkgs.txt); done; done;
这是一个快速的衬垫 - 你可以打印出更漂亮的
这种方式的工作方式是嵌套for循环,它将两个部分分成多个变量(你可以通过读取将它们放在一个循环中,如果你愿意的话)然后用grep计算第二个文件中的出现次数计数为零会使测试(())变为true并将缺少的包回显到文件missing_pkgs.txt
这是另一个快速的一个班轮,除了通过读取
加载一个循环和变量更高效之外,它做同样的事情 while read each; do read a b < <(echo $each) && ((! $(grep -c "$a.*$b" File2.txt))) && (echo "$a $b" >> missing_pkgs.txt); done < <(awk '/>=/{ print $1" "$3 }' File1.txt)
更简化:
while read a b; do ((! $(grep -c "$a.*$b" File2.txt))) && (echo "$a $b" >> missing_pkgs.txt); done < <(awk '/>=/{ print $1" "$3 }' File1.txt)