Regex 用于从XML文件中提取特定字段的Shell脚本
我是Linux shell的新手,无法理解regex 我的问题是: 我有一个名为Regex 用于从XML文件中提取特定字段的Shell脚本,regex,linux,bash,Regex,Linux,Bash,我是Linux shell的新手,无法理解regex 我的问题是: 我有一个名为/var/visitors 在这个目录下,我有像a,b,c,d这样的目录。 在每个目录中,都有一个名为list.xml的文件 例如,这里是来自/var/visitors/a的list.xml的内容: <key>Name</key> <string>Mr Jones</string> <key>ID</key> <string>51&l
/var/visitors
在这个目录下,我有像a
,b
,c
,d
这样的目录。
在每个目录中,都有一个名为list.xml的文件
例如,这里是来自/var/visitors/a
的list.xml
的内容:
<key>Name</key>
<string>Mr Jones</string>
<key>ID</key>
<string>51</string>
<key>Len</key>
<string>53151334</string>
以下是我所知道的我走了多远:
cd /var/visitors
find -name "list.xml" | xargs grep ?????
请帮助。Grep在这里帮不了你,你需要使用sed或awk之类的东西。这真的很糟糕,但是如果你确定它们的格式是正确的,你可以用一些perl来解析它。。。差不多
for (<STDIN>) {
if (/<key>([^<]*)</) { print $1 . " : "; }
if (/<string>([^<]*)</) { print $1 . "\n"; }
}
(){
如果(/([^假设您拥有包含以下文本的foo.bar文件:
<key>Name</key>
<string>Mr Jones</string>
<key>ID</key>
<string>51</string>
<key>Len</key>
<string>53151334</string>
名称
琼斯先生
身份证件
51
伦恩
53151334
类似这样的方法会奏效:
$ awk -F '[<>]' '{if (FNR%2==1) {printf "%s: ",$3} else {print $3}}' foo.bar
Name: Mr Jones
ID: 51
Len: 53151334
find -name "list.xml" | xargs cat | tr -d "\n" | sed 's/<\/string>/\n/g' | sed 's/<\/key>/: /g' | sed 's/<[^>]*>//g' | egrep "Name:|ID:" | sed 's/Name: /---\nName: /g'
$awk-F'[]'{if(FNR%2==1){printf“%s:,$3}否则{print$3}'foo.bar
姓名:琼斯先生
身份证号码:51
Len:53151334
如果这不完全是你想要的,那就进一步按鞋喇叭来满足你的具体要求。不优雅,但这会起作用:
$ awk -F '[<>]' '{if (FNR%2==1) {printf "%s: ",$3} else {print $3}}' foo.bar
Name: Mr Jones
ID: 51
Len: 53151334
find -name "list.xml" | xargs cat | tr -d "\n" | sed 's/<\/string>/\n/g' | sed 's/<\/key>/: /g' | sed 's/<[^>]*>//g' | egrep "Name:|ID:" | sed 's/Name: /---\nName: /g'
我没有包括分隔符行,因为我不确定您是否需要它,或者它只是使用grep
的产物。添加它很容易:
find -name "list.xml" | xargs awk -F '[<>]' -f xml.awk < in.dat
GRIP听起来是一个错误的工具。考虑创建一个XSLT,这不是任何人都能在SED中写这个吗?我的朋友告诉我使用其中一个。虽然我读了手册页,但我想不出一个解决方案:(因为它做不到,我希望其他人能告诉你如何使用sed或awk,因为我现在很忙,如果我休息一下,没有人回答,我会告诉你怎么做。我如何修改它,使它不考虑名称和id以外的属性??xml文档似乎是非常非结构化的:)例如,试着把它改成Jones先生。这样处理它就容易多了。我同意,XML的结构很糟糕。如果你能把它改一下,你最好把它改好:51Mr.Jones
$2 != "string" { K=$3 }
$2 == "string" { if ((K == "Name") || (K == "ID")) print K ": " $3 }