2013-04-10 57 views
0

我有很多(超過50個),在某些行(超過30/40每個文件)與格式不正確的XML文件:刪除兩個標記之間EOLS和空格在XML文件中

例子,這樣的:

<TAG1> 
    <TAG_TO_FORMAT> 
      a_random_string 

    </TAG_TO_FORMAT> 
    <AN_OTHER_TAG_TO_FORMAT> 
         an_other_random_string 
    </AN_OTHER_TAG_TO_FORMAT> 
    <OTHER_TAG>pifpafpouf</OTHER_TAG> 

</TAG1> 

應該變成這樣:

<TAG1> 
    <TAG_TO_FORMAT>a_random_string</TAG_TO_FORMAT> 
    <AN_OTHER_TAG_TO_FORMAT>an_other_random_string</AN_OTHER_TAG_TO_FORMAT> 
    <OTHER_TAG>pifpafpouf</OTHER_TAG> 

</TAG1> 

如果</TAG1>之前,新的生產線仍然存在,不要緊,我的關鍵問題是,每個模式:<TAG>random_string</TAG>必須在一條線上(random_string不包含EOL)

我在bash中找不到任何工具讓我執行此操作,那麼如何在bash中執行此操作? (或者在Python中,但我更喜歡bash)。

+0

awk可能真的很有用,在這裏,絕對值得使用谷歌搜索。我能得到的最接近的是'awk'/ $/{printf $ 0「」; next;} 1''。 – James 2013-04-10 16:35:57

+1

我建議使用'爲 – enzotib 2013-04-10 16:49:45

回答

0

有命令行工具,如xmllint整齊,可以使用這樣的:

tidy -xml -iq somefile.xml 

理論上xmllint也能做到這一點,但xmllint does not工作作爲OS X爲我描述的(沒有一個Linux實例現在方便在那裏測試):

xmllint --format --noblanks somefile.xml 
+0

整潔工作正常,xmllint沒有在我的Linux實例(centOs6.3) – 2013-04-11 08:57:20

+0

工作,我剛纔添加的選項-wrap 0到命令整潔,因爲我有一些行('')超出64個字符。 – 2013-04-11 09:18:01

+0

當您刪除'--format'並執行'xmllint --noblanks somefile.xml'時,請改爲。 'xmlint'在我的Ubuntu 15.10上完成了這項工作。 – 2016-02-09 11:26:06

0

我建議的Perl這樣的任務。

#!/usr/bin/env perl 

use strict; 
use warnings; 

my $text = join "", <>; 
$text =~ s/>\s+([^\s].*?[^\s])\s+<\//>$2<\//; 
print "$text"; 

這樣稱呼它:

my.pl <input.xml> output.xml 
+0

tidy'我不知道TAG_TO_FORMAT的價值,它可以有一個壞的格式 – 2013-04-11 08:10:43

+0

不同的標籤只是匹配在關閉和開啓角括號內的文字即可。查看更新的答案。 – 2013-04-11 08:37:28

0

好了,你可以做到這一點在sed:

x='TAG_TO_FORMAT' 
sed -e '/<'"$x"'>/{:next;/<\/'"$x"'>/!{N;bnext;};s/\n//g;s/>\s*/>/;s/\S\s*</</;}' 

當符合正確的標籤開始,我們進入一個循環收集線直到找到結束標記。然後,我們清除所有換行符,並清理> one one side錨定的空間,另一個是<。

+0

我無法知道TAG_TO_FORMAT的值,它可能會因格式不正確而具有不同的TAG。 – 2013-04-11 08:08:32

+0

下次你應該在你的問題中提到這樣的限制。 – William 2013-04-11 14:00:15

相關問題