Есть несколько способов сделать это sed. Одним из способов является задержка чтения, как рекомендуется в принятом ответе. Это также можно записать так:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... с небольшим явным упреждением вместо того, чтобы предвидеть, реализованным в другом месте с буфером удержания. Это неизбежно приведет к той же самой проблеме с последней строкой, которую @don_crissti отмечает, хотя, потому что N действительно увеличивает цикл строки, и команда read применяется к номеру строки.
Вы можете обойти это:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Не все seds будут интерпретировать, -чтобы означать стандартный ввод, но многие делают. ( POSIX говорит, sed что поддержка -должна означать стандартный вход, если разработчик хочет -означать стандартный вход ???)
Другой способ - обработать добавленное содержимое по порядку. Есть другая команда, которая планирует вывод таким же образом r, как и ead, и sedбудет применять его и read в порядке, в котором они написаны. Хотя это немного сложнее - это влечет за собой использование одного, sedчтобы aсвязать Pointerсовпадение с выводом другого sedв его сценарии.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Так что в основном первый sedпишет второй sedскрипт, который второй sedчитает на стандартном вводе (может быть ...) и применяет по очереди. Первый sedработает только для первого совпадения для Pointerнайденного, а затем qдля ввода данных. Его работа заключается в ...
s/[]^$&\./*[]/\\&/g;H
- Убедитесь, что все символы шаблона безопасно защищены от обратной косой черты, потому что второй
sedдолжен интерпретировать каждый бит, который он читает буквально, чтобы сделать его правильным. Как только это будет сделано, поместите копию в Hстарое место.
s|.*|/&/!p;//!d|p; x
- Скажите второй,
sedчтобы она pнабирала каждую строку ввода, !кроме той, которую /&/мы только что сохранили по шаблону; а потом на dэле все то же самое. pСнова наберите команды sed, затем xизмените hстарый и шаблонный буферы для работы с нашей сохраненной копией.
s|.|r file1&a\\&|p;q
- Единственный символ, с которым мы здесь работаем, - это
\newline, потому что он sedбудет добавлен перед тем, как мы с ним раньше справились H. Таким образом, мы вставляем команду r file1и следуем за ней с помощью нашей \newline, затем за командой ppend, a\\за aкоторой следует также \newline. Вся остальная часть нашей Hлинии поля следует этой последней \nлинии.
Сценарий, который пишет первым, выглядит примерно так:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
По сути, вторая sedбудет печатать каждую строку, а первая sed- для append. Для этой конкретной строки запланированы две отложенные записи в стандартный вывод: первая - это EAD, а вторая - копия строки, которую мы хотим после нее. В этом случае лечение первого даже не требуется (видите? Без обратной косой черты), но важно безопасно избежать того, что я делаю здесь, всякий раз, когда сопоставление с образцом повторно используется в качестве входных данных.rfile1sed
Во всяком случае, так что ... есть несколько способов.