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

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

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

файл1.txt:

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

нам нравится заменять строки, начинающиеся с !!, строками этого файла:

файл2.txt:

first line
second line
third line

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

aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line

решение1

Легко можно сделать с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

решение2

С GNU sed, аналогичноawk+getline

$ sed -e '/^!!/{R file2.txt' -e 'd}' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
  • Rдавал бы строку по одной за раз
  • порядок важен, сначала, Rа потомd


Сperl

$ < file2.txt perl -pe '$_ = <STDIN> if /^!!/' file1.txt
aaaaaa
bbbbbb
first line
second line
ccccc
ddddd
third line
  • передайте файл с заменяющими строками как стандартный ввод, чтобы мы могли прочитать его с помощью <STDIN>filehandle
  • если совпадающая строка найдена, заменить $_ее строкой из стандартного ввода

Связанный контент