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

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

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 

  • Замена строки в файле
  • Как обеспечить, чтобы строка, интерполированная в подстановку sed, избегала всех метамарков
  • Удалить строки, содержащие путь к файлу с помощью sed
  • Печать текста между многострочными разделителями
  • Изменить регистр n-й буквы в строке
  • Регулярное изменение / оператор (foo | bar) в GNU или BSD Sed
  • Самый быстрый инструмент `uniq` в linux
  • вставить новую строку, когда отрицательный + положительный шаблон найден с помощью sed
  • 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

    Debian только распознает eth0 при установке

    Где предоставить данные аутентификации сетевому прокси (Central Proxy) в Fedora?

    NFS-файл с тем же именем, но с другим содержимым в зависимости от хоста

    Могу ли я безопасно удалить раздел Ubuntu 12.04 и использовать незанятое пространство для моей элементарной ОС?

    Выберите версию gcc для компиляции модулей vmware

    lshw и df видят другой размер раздела (5,5 ТБ против 200 Мбайт). Зачем?

    Установка зависимостей Octave на CentOS 6 с использованием yum

    SSH-туннель с VNC?

    Получение tmux для копирования буфера в буфер обмена

    Лучше использовать локальный запуск rm -rf вместо nfs?

    Загрузка с usb не удалась, поскольку я пытаюсь установить элементарную ОС на своем ПК

    WeeChat не использует IPv6

    Как ограничить поиск текущей строкой

    Как вызвать другую часть скрипта с -x

    Как сделать это `echo | Выход bc` будет в той же строке, что и выход эха после?

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