2011-02-04 2 views
4

Мне нужен скрипт, который может писать текст в существующий файл, начиная с строки 10. Это пустая строка, поэтому она не будет найти/заменить. Желательно, чтобы это было в bash, но все, что может интерпретировать терминал, будет работать нормально.Как написать строку 10?

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 

Спасибо заранее, Джо

+1

Использование 'ed', конечно. – tchrist

ответ

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 для команды sed или 11 для версии 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 
+0

спасибо, я вижу, что sed выглядит намного проще ... и да вставить в строке 10, так как уже есть текст в строке 9 и 11. – jmituzas

+0

'sed -i' не является стандартным. – tchrist

+0

Конечно. Он будет работать только на Linux, FreeBSD, Mac OS и Cygwin. В Solaris, AIX, HP-UX и т. Д. Вам понадобится GNU sed, или перенаправить вывод в файл temp, а затем «mv». – Mikel

2

Вы только могли бы сделать:

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

Обратите внимание, что это дробно быстрее, чем делать это с sed

0

Если файл уже имеет 9 строк, было бы легко на оболочке;)

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

Если файл может содержать менее 9 строк или даже может быть больше (и вы до хотите написать в строке 10) Perl-Modul 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"; 
+1

Почему не просто 'perl -i'? – tchrist

+0

@Mikel жаль, что у меня были проблемы и эры, поэтому я переделал ... Спасибо за так много быстрых ответов. – jmituzas

2

С СЕПГ:

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

С гну-СЭД:

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

С AWK:

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

'sed -i' не является стандартным. – tchrist

+0

Вот почему я написал «с gnu-sed» :) – marco

1
sed 10cFoobar foo 

заменяет строку 10 на «Foobar». Это может содержать разрывы строк:

sed 4cFoobar"\nFoobar" foo 

Это отличие от решения Микеля, который использовал вместо c. Разница в том, что она заменяется, другая добавляется.

0

Рубин (1.9+)

$ ruby -i.backup -ne 'print ($.==10)?"word\n":$_' file 
Смежные вопросы