Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用于从XML文件中提取特定字段的Shell脚本_Regex_Linux_Bash - Fatal编程技术网

Regex 用于从XML文件中提取特定字段的Shell脚本

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

我是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</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 }