Есть несколько способов сделать это sed
. Одним из способов является задержка чтения, как рекомендуется в принятом ответе. Это также можно записать так:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... с небольшим явным упреждением вместо того, чтобы предвидеть, реализованным в другом месте с буфером удержания. Это неизбежно приведет к той же самой проблеме с последней строкой, которую @don_crissti отмечает, хотя, потому что N
действительно увеличивает цикл строки, и команда r
ead применяется к номеру строки.
Вы можете обойти это:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Не все sed
s будут интерпретировать, -
чтобы означать стандартный ввод, но многие делают. ( POSIX говорит, sed
что поддержка -
должна означать стандартный вход, если разработчик хочет -
означать стандартный вход ???)
Другой способ - обработать добавленное содержимое по порядку. Есть другая команда, которая планирует вывод таким же образом r
, как и ead, и sed
будет применять его и r
ead в порядке, в котором они написаны. Хотя это немного сложнее - это влечет за собой использование одного, 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
- Единственный символ, с которым мы здесь работаем, - это
\n
ewline, потому что он sed
будет добавлен перед тем, как мы с ним раньше справились H
. Таким образом, мы вставляем команду r file1
и следуем за ней с помощью нашей \n
ewline, затем за командой ppend, a\\
за a
которой следует также \n
ewline. Вся остальная часть нашей H
линии поля следует этой последней \n
линии.
Сценарий, который пишет первым, выглядит примерно так:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
По сути, вторая sed
будет печатать каждую строку, а первая sed
- для a
ppend. Для этой конкретной строки запланированы две отложенные записи в стандартный вывод: первая - это EAD, а вторая - копия строки, которую мы хотим после нее. В этом случае лечение первого даже не требуется (видите? Без обратной косой черты), но важно безопасно избежать того, что я делаю здесь, всякий раз, когда сопоставление с образцом повторно используется в качестве входных данных.r
file1
sed
Во всяком случае, так что ... есть несколько способов.