Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何写入第10行?_Perl_Shell_Sed_Awk - Fatal编程技术网

Perl 如何写入第10行?

Perl 如何写入第10行?,perl,shell,sed,awk,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 "/

我需要一个脚本,可以写文本到一个现有的文件,从第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
提前感谢,,
Joe

使用
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
awk
中,它是
NR

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

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

sed -i -e 's/^$/replacement text/' file
你可以这样做:

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

请注意,这比使用
sed

执行要快一点,如果文件已经有9行,那么在shell上就容易多了;)

如果文件包含的行数可能少于9行,甚至可能更大(您仍然希望写入第10行),perl模块将使事情变得非常简单:

#!/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";
对于sed:

sed '10 s/^/text' file >file.new && mv file.new file
使用gnu时:

sed -i '10 s/^/text' file
使用awk:

awk 'NR==10 {$0="text"} 1' file >filen.new && mv file.new file
将第10行替换为“Foobar”。这可能包含换行符:

sed 4cFoobar"\nFoobar" foo
这与Mikel使用a而不是c的解决方案形成对比。区别在于一个替换,另一个追加。

Ruby(1.9+)


谢谢,我可以看到sed看起来更容易。。。是的,在第10行插入,因为第9行和第11行已经有文本。确定。它只适用于Linux、FreeBSD、Mac OS和Cygwin。在Solaris、AIX、HP-UX等平台上,您需要安装GNU-sed,或者将输出重定向到tempfile,然后
mv
it
perl-p-i-e…
。这就是我写“使用gnu sed”的原因:@Mikel很抱歉我遇到了问题和错误,所以我重新编辑了。。。谢谢你这么快的回复。
awk 'NR==10 {$0="text"} 1' file >filen.new && mv file.new file
sed 10cFoobar foo
sed 4cFoobar"\nFoobar" foo
$ ruby -i.backup -ne 'print ($.==10)?"word\n":$_' file