Как написать в строке 10? - PullRequest
       5

Как написать в строке 10?

4 голосов
/ 04 февраля 2011

Мне нужен скрипт, который может записывать текст в существующий файл, начиная со строки 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 ]

8 голосов
/ 04 февраля 2011

Использование 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
2 голосов
/ 04 февраля 2011

С седом:

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
2 голосов
/ 04 февраля 2011

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

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

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

1 голос
/ 04 февраля 2011
sed 10cFoobar foo

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

sed 4cFoobar"\nFoobar" foo

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

0 голосов
/ 04 февраля 2011

Рубин (1,9 +)

$ ruby -i.backup -ne 'print ($.==10)?"word\n":$_' file
0 голосов
/ 04 февраля 2011

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

$ 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";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...