0

我有一个完整的文件,其中包含使用“gsed regexp -i FILENAME”从 XML 文件中提取的行。文件中的行都是其中一种格式:

<field number='1' name='Account' type='STRING'W/>

<field number='2' name='AdvId' type='STRING'W>

我在最后插入了一个代表可选空格的“W”。尽管“number”总是在“type”之前,但在整个文件中的所有行中,属性的顺序和数量不一定相同。

我正在寻找的是一个正则表达式“regexp”,我可以将它提供给 gnu sed,以便这个命令:

gsed 正则表达式 -i 文件名

给了我一个文件,其中的行如下所示:

1 个字符串

2 串

我不关心结果中的空格数量,只要在数字后面有一些空格,并且每行末尾有一个换行符。

我确信这是可能的,但我只是无法在合理的时间内弄清楚如何。任何人都可以帮忙吗?

非常感谢,朱尔斯

4

7 回答 7

2

使用xsh ,一个围绕XML::LibXML的 Perl 包装器:

open file.xml ;
for //field echo @number @type ;
于 2013-08-07T15:44:15.743 回答
1

我认为您最好使用 XMLStarlet 等命令行XML工具。这将与 shell 很好地集成并让您执行 XPath 搜索。它支持 XML,因此可以正确处理字符编码、空格等。

于 2013-08-07T15:40:06.317 回答
1

我确信这可以优化,但它适用于我并回答你的问题:

 sed "s/^.*number='\([0-9]*\)'.*type='\(.*\)'.*$/\1 \2/" <filename>

这么说,我认为其他人是对的,如果你有一个 XML 文件,你应该使用 XML 解析器。

于 2013-08-07T15:42:11.677 回答
0
sed -ni "/<field .*>/s@^.*[[:space:]]number='\\([^']\\+\\).*[[:space:]]type='\\([^']\\+\\).*@\1 \2@p" FILENAME

或者,如果您不介意数字和类型的内容是可选的:

sed -ni "/<field .*>/s@^.*[[:space:]]number='\\([^']*\\).*[[:space:]]type='\\([^']*\\).*@\1 \2@p" FILENAME

只需根据[^']\\+[^']*的喜好更改。

于 2013-08-07T15:50:35.920 回答
0

简单的切割应该适合你:

剪切 -f2,6 -d"'" --output-delimiter=""

如果你真的想要 sed:

sed -r "s/. '(. )'. type='(. )'.*/\1 \2/"

于 2013-08-07T15:45:52.487 回答
0

你可以使用这个:

sed -r "s/<field [^>]*?number='([0-9]+)'[^>]*?type='([^']+)'[^>]*>/\1 \2/"
于 2013-08-07T15:48:45.213 回答
0

最好使用 XML 解析器,但如果必须使用 sed:

sed 's/<field number=\'(.*?)\'.*?type=\'(.*?)\'/\1 \2

于 2013-08-07T15:49:31.003 回答