如何写入第10行?

时间:2011-02-04 00:56:06

标签: perl shell sed awk

我需要一个脚本,可以将文本写入从第10行开始的现有文件。这是一个空行,因此它不会是一个查找/替换。希望最好是在bash中,但终端可以解释的任何东西都可以正常工作。

RE-EDITED:

抱歉,但在我测试后仍然遇到一些问题...认为它与我想要写入文件有关。也许这会让事情变得更容易......

  3 c
  4 d
  5 e
  6 f
  7 g
  8 h
  9 i
 10      zone "$zone" in {
 12          type master;
 13          file "/etc/bind/db.$zone";
 14   };
 15 k
 16 l
 17 m

先谢谢, 乔

6 个答案:

答案 0 :(得分:8)

使用sed

sed -i -e '10a\
new stuff' file

使用bash

IFS=$'\n'
i=0
while read -r line; do
    i=$((i+1))
    if test $i -eq 10; then
        echo "new stuff"
    else
        echo "$line"
    fi
done <file >file.tmp
mv file.tmp file

请注意,我不确定您是指在第10行或第11行插入,因此请仔细检查我在上面写的10位置。对9命令,您可能需要sed11版本可能需要bash

perl中,您可以使用$NR变量。

open FILEHANDLE, "<file";
while (<FILEHANDLE>) {
    if ($NR == 10) {
        # do something
    }
}

awk中,它是NR

awk 'NR != 10 { print }
NR == 10 { print "Something else" }' file

但请注意,您可以找到并替换空行,例如

sed -i -e 's/^$/replacement text/' file

答案 1 :(得分:2)

你可以这样做:

head -10 fileA > fileB; echo "new text" >> fileB;

请注意,这比使用sed

快一些

答案 2 :(得分:2)

使用sed:

sed '10 s/^/text' file >file.new && mv file.new file

使用gnu-sed:

sed -i '10 s/^/text' file

使用awk:

awk 'NR==10 {$0="text"} 1' file >filen.new && mv file.new file

答案 3 :(得分:1)

sed 10cFoobar foo

用“Foobar”替换第10行。这可能包含换行符:

sed 4cFoobar"\nFoobar" foo

这与使用a而不是c的Mikel的解决方案形成对比。区别在于一个人替换,另一个人补充。

答案 4 :(得分:0)

如果文件已经有9行,那么shell就很容易了;)

$ echo "I am line 10" >> file-with-9-lines.txt

如果文件可能包含少于9行甚至可能更大(并且您仍想写入第10行),则perl模块Tie::File将使事情变得简单:

#!/usr/bin/perl
use Tie::File;
tie my @file, 'Tie::File', '/path/to/some/file' or die $!;
$file[9] = "I am the content of line 10";

答案 5 :(得分:0)

Ruby(1.9 +)

$ ruby -i.backup -ne 'print ($.==10)?"word\n":$_' file