删除两个标记之间EOLS和空格在XML文件中

问题描述:

我有很多(超过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

有命令行工具,如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

我建议的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

好了,你可以做到这一点在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