2013-08-12 148 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