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

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

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 

  • Удалить определенное слово и пробел
  • Удаление всех комментариев C с помощью sed
  • Как предупредить sed -i от уничтожения символических ссылок?
  • Найти файлы, для которых несколько вариантов этого имени файла существуют вместе в одном каталоге
  • Как использовать адрес содержимого в sed в osx без ошибки «ожидаемый контекстный адрес»
  • Удалите пробелы и круглые скобки в именах файлов с помощью sed
  • Найти пустой тег в `xml` с помощью команды Unix
  • Заменить только первый символ совпадающего шаблона
  • 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 позволяет использовать код вместо строки в разделе замены
    Interesting Posts

    Предотвратить блокировку от плохого поведения вкладки браузера?

    Не удалось запустить поиск elastics

    Сообщение SIPp "hello world" для Asterisk

    Невозможно переключиться на определенную системную учетную запись с помощью su

    как вычесть первое значение из последнего в столбце по строке в оболочке?

    Почему modinfo говорит «не удалось найти модуль», но lsmod утверждает, что модуль загружен?

    Возможно ли создать сжатый ленточный архив в папке из другого каталога?

    Увеличение размера VDI, не отражающее

    Компиляция другой версии ядра

    Изменение разрешений CIFS на FreeNAS?

    Заставить локальный IP-трафик проходить через LAN без изменений IP-адреса

    Защитная оболочка Power Broker или полный сценарий оболочки

    Как перенаправить вывод команд Linux на конкретную строку и столбец в csv?

    Как настроить поведение двойного клика в X-терминале?

    Могу ли я заменить номер раздела на UUID?

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