Заменяйте строки, соответствующие шаблону, строками из другого файла в порядке

Я хочу заменить строки, соответствующие шаблону, из одного файла из строк по порядку из другого файла, например:

file1.txt :

aaaaaa bbbbbb !! 1234 !! 4567 ccccc ddddd !! 1111 

мы хотели бы заменить строки, начиная с !! с строками этого файла:

file2.txt :

 first line second line third line 

поэтому результат должен быть:

 aaaaaa bbbbbb first line second line ccccc ddddd third line 

2 Solutions collect form web for “Заменяйте строки, соответствующие шаблону, строками из другого файла в порядке”

Легко можно сделать с помощью awk

 awk ' /^!!/{ #for line stared with `!!` getline <"file2.txt" #read 1 line from outer file into $0 } 1 #alias for `print $0` ' file1.txt 

Другая версия

 awk ' NR == FNR{ #for lines in first file S[NR] = $0 #put line in array `S` with row number as index next #starts script from the beginning } /^!!/{ #for line stared with `!!` $0=S[++count] #replace line by corresponded array element } 1 #alias for `print $0` ' file2.txt file1.txt 
 $ perl -pe 'BEGIN{ chomp(@a=`cat file2.txt`) } s/^!!.*/$a[$i++]/e' file1.txt aaaaaa bbbbbb first line second line ccccc ddddd third line 
  • @a array хранит все строки из file2.txt с завершением символа новой строки. BEGIN для выполнения этой строки кода один раз при запуске скрипта
  • s/^!!.*/$a[$i++]/e заменить строки, начиная с !! со значением из массива @a . Индекс сохраняется в переменной $i (значение по умолчанию равен нулю) и получает приращение для каждого доступа. Флаг e позволяет использовать код вместо строки в разделе замены
  • sed не будет расширять мою переменную BASH в скрипте
  • sed или tr однострочный, чтобы удалить все числовые цифры
  • Обработанный файл Sed отображается по-разному в vi vs cat
  • присоединяйте два файла на основе столбца, когда в сценарии bash нет взаимно однозначного соответствия (awk, grep, sed)
  • Имена файлов каталогов с sed с пробелами
  • как вставить пробел между отдельными цифрами в файле?
  • Изменить заголовок с помощью sed или awk
  • sed: захват и замена всех данных между последней обратной косой чертой и запятой
  • Удалить последнюю запятую в шаблоне
  • Извлечь начальное и конечное положение общего идентификатора
  • странное поведение при сопоставлении шаблонов sed
  • Добавление значений
  • Interesting Posts

    Нет / proc / bus / usb directory

    Как автоматизировать подключение к нескольким сетевым устройствам, выполнить команду и сохранить вывод в файл?

    Запуск скрипта travis, дешифрование ssh-ключа, запрос пароля и пароля

    Не удается создать клиентский сертификат после того, как я стал его собственным центром сертификации

    Что делает «-y» в «yum -y groupinstall gnome»?

    Linux Mint 15 не спящий режим

    Что такое log_daemon_msg?

    Arch Linux не может загрузиться с USB-ключа (невозможно смонтировать выбранный раздел)

    Несколько методов ввода файлов

    Бесплатный эквивалент Matlab для Linux

    Можете ли вы заставить систему Linux остановить и загрузите мою малину в определенное время?

    Осведомление командной строки Linux

    Как добавить разрывы строк после каждого n-го экземпляра разделителя в perl

    Неожиданный EOF при поиске соответствия `''

    Как вставить строку в текстовую переменную в указанной позиции

    Linux и Unix - лучшая ОС в мире.