Выполнение этого с помощью sed требует некоторых дополнительных обвинений оболочки. Предполагая Баш, вы могли бы использовать
sed -i 18r<(sed '16,80!d' file1) file2
Где <(sed '16,80!d' file1)
заменяется на имя трубы, из которой выход sed '16,80!d' file1
может быть прочитан.
Как правило, я чувствую, что лучше делать это с помощью awk (если немного дольше), потому что awk лучше оборудован для обработки нескольких входных файлов. Например:
awk 'NR == FNR { if(FNR >= 16 && FNR <= 80) { patch = patch $0 ORS }; next } FNR == 18 { $0 = patch $0 } 1' file1 file2
Это работает следующим образом:
NR == FNR { # While processing the first file
if(FNR >= 16 && FNR <= 80) { # remember the patch lines
patch = patch $0 ORS
}
next # and do nothing else
}
FNR == 18 { # after that, while processing the first file:
$0 = patch $0 # prepend the patch to line 18
}
1 # and print regardless of whether the current
# line was patched.
Однако этот подход не поддается на месте редактирования файлов. Обычно это не проблема; Я бы просто использовать
cp file2 file2~
awk ... file1 file2~ > file2
с дополнительным преимуществом наличия резервной копии в случае, если вещи идут грушевидной формы, но в конце концов, это до вас.
Его невозможно. – 123
@ User112638726: Почему бы и нет ?! – mYself
Ну, может быть, если вы знаете точное количество строк в каждом файле и не хотите использовать -i, но это больше усилий, чем у вас в настоящее время. В качестве альтернативы вы можете просто использовать awk. – 123