2013-08-12 101 views
0

我有很少的XML文件,并且有些用户在中间添加了额外的空格(如元素标记或文本标记),并且比较多个版本的文件变得非常困难。sed:从文本中间删除空格

实例(xml文件)

<?xml version="1.0"?> 
<catalog> 
    <book id="bk101"> 
     <author>Gambardella, Matthew</author > 
     <title>XML Developer's Guide  </title> 
     <genre>Computer</genre> 
     <price>44.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications 
     with XML.</description> 
    </book> 
    <book id="bk102"  > 
     <author>Ralls, Kim</author> 
     <title>Midnight Rain</title> 
     <genre>Fantasy</genre> 
     <price>5.95</price> 
     <publish_date>2000-12-16</publish_date> 
     <description>A former architect battles corporate zombies, 
     an evil sorceress, and her own childhood to become queen 
     of the world.</description> 
    </book> 
</catalog> 

正如你可以看到上面的例子代码,笔者的元素标签和标题的文本节点中的第一本书元素有多余的空格。同样,第二书籍元素的元素标签具有额外的空间。

我想要一个正则表达式来搜索这些类型的空白(多于1个相邻的空格),但我不希望前导空白。如果我不留下主要的空格(起始行),并将其替换为单个空格,则缩进将会丢失。

我可以通过一些方法来处理这个问题(比如先删除所有的double +空格,然后在文件上做一个xmllint格式),但是如果有人能够给我一个reg中间空格线。

我试过^,\ s和^ \ s的组合,但我似乎无法得到解决方案。所以如果有人可以提出建议,那将会非常有帮助。 (文本节点的多个空格是不正确的值按我们的项目的设计,以便消除他们不会造成任何不良影响。)

+0

你真的想要什么,不管你是否意识到,都是一个正确的XML解析/处理工具集,而不是一个正则表达式引擎... – twalberg

回答

2

这可能会为你工作(GNU SED):

sed -r 's/(\S)\s+([<>])/\1\2/g' file 

这看起来对一个非空格,后跟一个或多个空格,然后是<>,并删除空格一次或多次。

+0

哇...像魅力一样工作..正则表达式非常复杂,除非你打破了他们的理解。谢谢(对不起,不能赞成,因为我需要15个代表) – Asheesh