我有大约2000个文件,我需要在开头和结尾添加行。
我需要在每个文件的开头添加这些行:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
我还需要将它作为每个文件的最后一行:
</urlset>
这些文件都在同一个文件夹中,都是.xml文件。
我认为最好和最快的方法是通过命令行或perl,但我真的不确定。我已经看过一些关于这样做的教程,但我认为我需要插入的行中的所有字符都是搞乱的。任何帮助将不胜感激。谢谢!
答案 0 :(得分:4)
因为你要求Perl ......
将整个文件加载到内存中的版本:
perl -i -0777pe'
$_ = qq{<?xml version="1.0" encoding="UTF-8"?>\n}
. qq{<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n}
. $_
. qq{</urlset>\n};
' *.xml
一次只能读取一行的版本:
perl -i -ne'
if ($.==1) {
print qq{<?xml version="1.0" encoding="UTF-8"?>\n},
qq{<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n};
}
print;
if (eof) {
print qq{</urlset>\n};
close(ARGV);
}
' *.xml
注意:eof
与eof()
不同。
注意:close(ARGV)
会导致行号重置。
答案 1 :(得分:3)
对于Perl,您可以使用Tie::File轻松完成。
#!/usr/bin/env perl
use utf8;
use v5.12;
use strict;
use warnings;
use warnings qw(FATAL utf8);
use open qw(:std :utf8);
use Tie::File;
for my $arg (@ARGV) {
# Skip to the next one unless the current $arg is a file.
next unless -f $arg;
# Added benefit: No such thing as a file being too big
tie my @file, 'Tie::File', $arg or die;
# New first line, will become the second line
unshift @file, '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
# The real first line.
unshift @file, '<?xml version="1.0" encoding="UTF-8"?>';
# Final line.
push @file, '</urlset>';
# All done.
untie @file;
}
保存到您想要的任何内容,然后将其作为perl whatever_you_named_it path/to/files/*
运行。
答案 2 :(得分:2)
使用sed:
sed -i -e '1i<?xml version="1.0" encoding="UTF-8"?>\
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' \
-e '$a</urlset>' *.xml
答案 3 :(得分:1)
尝试在shell中执行此操作,我只使用glob和简单concatenation。
for file in *.xml; do
{
echo '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
cat "$file"
echo "</urlset>"
} > /tmp/file$$ &&
mv /tmp/file$$ "$file"
done