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

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

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 

  • Печать между двумя шаблонами только в том случае, если первый шаблон появляется во второй раз
  • как удалить последние две строки с разделителями из каждой строки в большом файле
  • Использование tee для добавления строки в файл, а также использовать ее в качестве замены шаблона в другом файле
  • Как использовать + в регулярном выражении в sed?
  • Отменить перемещение букв с помощью sed
  • Извлечь абзац, разделенный на *** с помощью AWK
  • dpkg: error: дублировать запрос запуска файла для имени файла `/ usr / lib / gio / modules 'и пакета` libglib2.0-0'
  • Как заставить 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 позволяет использовать код вместо строки в разделе замены
    Linux и Unix - лучшая ОС в мире.