删除两个标记之间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)。
有命令行工具,如xmllint整齐,可以使用这样的:
tidy -xml -iq somefile.xml
理论上xmllint也能做到这一点,但xmllint does not工作作为OS X为我描述的(没有一个Linux实例现在方便在那里测试):
xmllint --format --noblanks somefile.xml
整洁工作正常,xmllint没有在我的Linux实例(centOs6.3) – 2013-04-11 08:57:20
工作,我刚才添加的选项-wrap 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
tidy'我不知道TAG_TO_FORMAT的价值,它可以有一个坏的格式 – 2013-04-11 08:10:43
不同的标签只是匹配在关闭和开启角括号内的文字即可。查看更新的答案。 – 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锚定的空间,另一个是<。
我无法知道TAG_TO_FORMAT的值,它可能会因格式不正确而具有不同的TAG。 – 2013-04-11 08:08:32
下次你应该在你的问题中提到这样的限制。 – William 2013-04-11 14:00:15
awk可能真的很有用,在这里,绝对值得使用谷歌搜索。我能得到的最接近的是'awk'/ $/{printf $ 0“”; next;} 1''。 –
James
2013-04-10 16:35:57
我建议使用'为 – enzotib 2013-04-10 16:49:45