在多个文件的开头和结尾插入行

时间:2012-11-02 00:15:20

标签: perl command-line

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

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

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

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

</urlset>

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

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

4 个答案:

答案 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

注意:eofeof()不同。
注意: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)

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

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