3

我有大约 2000 个文件需要在开头和结尾添加行。

我需要在每个文件的开头这些行:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

我还需要将其作为每个文件的最后一行:

</urlset>

这些文件都在同一个文件夹中,并且都是 .xml 文件。

我认为最好和最快的方法是通过命令行或 perl,但我真的不确定。我已经看过一些关于这样做的教程,但我认为我需要插入的行中的所有字符都搞砸了。任何帮助将不胜感激。谢谢!

4

4 回答 4

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)导致行号重置。

于 2012-11-02T00:49:59.293 回答
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/*.

于 2012-11-02T00:49:50.003 回答
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
于 2012-11-02T00:31:49.590 回答
1

尝试在中执行此操作,我只使用和简单的

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
于 2012-11-02T00:18:10.557 回答