2012-10-09 135 views
2

我们的应用程序在接收端对XML数据进行复制分析。我们的应用程序没有可用的Java或.NET,但在Unix中运行,因此它具有awk和Perl。从xml中删除xml声明使用perl或awk的数据

文件中的XML消息包含:

<?xml version="1.0" encoding="ISO-8859-1" ?> 

我尝试了一些选项在Perl和awk,让他们删除,但不能让这些工作:

perl -p -i -e "s/<?xml version="1.0" encoding="ISO-8859-1" ?>//g" inputFile 
perl -p -i -e "s/<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>//g" inputFile 
perl -p -i -e "s/<\?xml version="1.0" encoding="ISO-8859-1" \?>//g" inputFile 

任何其他选项使用PERL或AWK来做到这一点?

+1

在“接收”XML时是否使用了XML解析器? XML声明对于解析器非常有用,并且尝试用除解析器之外的任何其他任何东西来处理任何重要的XML将导致疯狂。而且,如果你使用的是Unix,那么你可以使用各种语言,如果你安装它们的话。 –

+0

查看“[如何使用awk,Perl或Python挖掘XML文档?](http://stackoverflow.com/a/909076/128421)”以获取相关答案。 –

+0

你的Perl代码不工作,因为'?'是一个正则表达式元字符。在每种情况下用'.'或'\?'替换'?',你应该没问题。 –

回答

1

这为我工作,而不会覆盖数据文件:

perl -p -e 's/<\?xml version="1.0" encoding="ISO-8859-1" \?>//g' 

我只覆盖文件(-i)当我确定我会得到基本的正则表达式工作不会造成伤害。

+0

谢谢@JonathanLeffler。有效。 – diaryfolio

1

如果您的文件是XML,则不必匹配整个字符串。 <?xml version就够了。

尝试:

sed -i '/<\?xml version/d' file 

测试

kent$ echo '<?xml version="1.0" encoding="ISO-8859-1" ?> 
foo 
bar 
xyz 
hello 
there'|sed '/<\?xml version/d' 
foo 
bar 
xyz 
hello 
there 
+0

,它没有工作。 “sed:非法选项 - 我”。我尝试没有“-i”选项,但它错误地截断了消息。 – diaryfolio

+0

@diaryfolio在答案中看到了测试,它确实给了你想要的东西,不是吗? – Kent

+0

'$ cat inputFile.xml <?xml version =“1.0”encoding =“ISO-8859-1”?>星期一' '$ cat inputFile.xml | sed'/ <\?xml version/d'' '$' 似乎它截断了整个消息 – diaryfolio