2014-09-24 2 views
1

Моего вопроса варианта следующего:Заменить строку в текстовом файле с линией из другого текстового файла

bash: replace an entire line in a text file

Проблемы был заменить Nth строки файла с заданной строкой (линия замены). В моем случае я не могу просто ввести строку замены, но я должен прочитать ее из другого файла.

Например:

textfile1:

my line 
your line 
his line 
her line 

textfile2:

our line 

Я хочу заменить на 2-й линии textfile1 с линией от textfile2.

Я думал, что я мог бы просто читать textfile2

while IFS= read SingleLine 

и т.д., а затем использовать $SingleLine в качестве замены строки, но мне не удалось ... В зависимости от типа цитат, которые я использовал (пожалуйста, простите мое невежество. ..) я в конечном итоге заменить линию в вопросе с текстом $ SingleLine или SingleLine или просто получить сообщение об ошибке: - [

Я уверен, что вы можете мне помочь !!

EDIT о решении: я пошел для встроенного решения с небольшим изменением

sed '2d;1r textfile2' textfile1 > newfile1 

Чтобы заменить Nth линию, то решение будет (см комментарии по принятому решению для объяснения)

sed 'Nd;Mr textfile2' textfile1 > newfile1 

с N номером нужной строки и M = N-1.

Спасибо всем!

ответ

4

Использование sed:

sed '2d;1r file2' file1 
my line 
our line 
his line 
her line 

Чтобы сделать его инлайн редактирования:

sed -i.bak '2d;1r file2' file1 
+0

Спасибо! Но ... не могли бы вы объяснить часть «2d; 1r»? В частности: что, если бы я хотел заменить 4-ю строчку ?! – ppapakon

+0

'2d' удаляет 2-ю строку, а' 1r file2' заменяет содержимое file2 после конца строки 1. Для замены использования 4-й строки: 'sed '4d; 3r file2' file1' – anubhava

+1

Отлично! Спасибо, это было очень быстро! :-) Я пошел для встроенного решения с небольшим изменением 'sed '2d; 1r textfile2' textfile1> newfile1', чтобы сохранить новый файл, не разрушая исходный. – ppapakon

1

Я пошел бы с sed раствором anubhava публикуемых. Вот альтернатива в bash.

#!/bin/bash 

while read -r line; do 
    ((++linenum == 2)) && while read -r line; do 
     echo "$line" 
     continue 2 # optional param to come out of nested loop 
    done < textfile2 
    echo "$line"; 
done < textfile1 

или с помощью awk:

awk 'FNR==2{if((getline line < "textfile2") > 0) print line; next}1' textfile1 
0

Является ли этот сценарий или непосредственно из терминала? Если это сценарий. Вы можете попытаться сохранить файл 2 в переменной fromfile2=$(cat textfile2) Затем замените текстовый файл1 на sed -i "s/your line/$fromfile2". Надеюсь, это поможет.

+0

Спасибо! Я забыл указать, что я также не могу ввести вторую строку исходного файла. Что я пишу вместо «вашей линии» в приведенном выше? Я попробовал sed «2s/*/$ fromfile2 textfile1> textfile1new, но он не работал (« unterminited substitute in regular expression »). – ppapakon

Смежные вопросы