sed:从文本中间删除空格

时间:2013-08-12 10:39:15

标签: regex sed whitespace removing-whitespace

我的XML文件很少,有些用户在中间添加了额外的空格(比如在元素标签或文本标签中),并且很难比较多个版本的文件。

示例(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 --format),但是如果有人可以给我一个reg exp来表示行中间的空格会很有用

我尝试了^,\ s和^ \ s的组合,但我似乎无法得到解决方案。因此,如果有人可以提出建议,那将非常有帮助。 (根据我们项目的设计,文本节点中的多个空格是不正确的值。因此删除它们不会造成任何不利影响)

1 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

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

这会查找非空格,后跟一个或多个空格,后跟<>,并删除空格一次或多次。