我有一个包含以下内容的文件:
<People>
<Person>
<Name>Joe Blogs</Name>
<Address>55 Oxford St</Address>
...lots of other properties
</Person>
<Person>
<Name>Jane Pearson</Name>
<Address>100 Samson St</Address>
...lots of other properties
</Person>
</People>
我唯一可以使用的工具是:awk、sed、grep、pcre_grep
我想提取每个“Person”标签的内容,删除“Name”行,并计算块的md5。
到目前为止我已经尝试过:
awk '/<Person>/,/<\/Person>/{print $0}' input.xml | md5sum
然而,这只返回一个 md5。每个区块都没有一个。
答案1
尝试以下 awk 脚本:
awk '
/<Person>/,/<\/Person>/{
if (! /<Name>/)
a=a s $0
s="\n"
}
/<\/Person>/{
system("echo \""a"\" |md5sum - ")
a=s=""
}' input.xml
解释:
- 将标签之间的所有行收集
Person
到a
变量中 - 当满足结束标记时
/Person
调用系统命令而不是空a
变量
答案2
使用 sed 如下
sed -n '/^ *<Person> *$/,/^ *<\/Person> *$/{/<Name>/{d};p}' file|md5sum
定位 中的所有行 *<Person> *$/,/^ *<\/Person> *
。
/<Name>/
检查该范围是否具有标签“Name”,然后删除此行。然后打印行范围并通过管道传输到 md5sum