更改文件中的行

时间:2009-04-21 20:36:27

标签: linux text file replace

我想用另一个文件中第6-15行的文本替换(例如)文件中第5-15行的文本。但我想在大约2000个文件上执行此操作,而不是必须手动执行此操作。

我可以在perl中编写脚本,但我想尝试使用任何可能的内置函数。

2 个答案:

答案 0 :(得分:4)

for files in PATTERN ; do
  sed -n '1,14p' $files > newfile.$files
  sed -n '6,15p' ANOTHERFILE >> newfile.$files
  sed -n '15,$p' $files >> newfile.$files
done

注意:它不是资源有效的,但我在一个非常强大的服务器上写它;-) 还有其他几种方法可以做到。

答案 1 :(得分:3)

我可能会使用sed

for file in bar baz bam; do
    newfile=$(mktemp)
    (sed '5q' $file; sed -n '6,15p' foo; sed '1,15d' $file) > $newfile
    mv -f $newfile $file
done

或Perl

#!/usr/bin/env perl

use v5.6;  # lexical filehandles need Perl >= 5.6

# usage: $0 foo bar baz bam
# replaces lines 4-15 of qw(bar baz bam) with lines 6-15 of foo 

my @ins;

{
    open my $fh, shift;
    while (<$fh>) {
        push @ins, $_ if 6 .. 15;
        last if $. >= 15;
    }
}

$^I = '';

while (<>) {
    print if not 5 .. 15;
    print @ins if $. == 4;
}
continue {
    close ARGV if eof ARGV;
}

ed也有效。

echo '6,15wq foo-part' | ed foo
for i in bar baz bam; do
    echo -e '5,15d\n4r foo-part\nwq' | ed $i
done
rm -f foo-part