Hay algunas maneras de hacer esto con / sed. Una forma es una lectura retrasada como se recomienda en la respuesta aceptada. También podría escribirse como:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... con un poco de anticipación explícita en lugar de la retrospectiva implementada en otros lugares con el búfer de retención. Sin embargo, eso inevitablemente tendrá el mismo problema con la última línea que @don_crissti observa, ya N que incrementa el ciclo de la línea y el rcomando ead se aplica por número de línea.
Puedes evitarlo:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
No todos los seds interpretarán el -significado de entrada estándar, pero muchos lo hacen. ( POSIX dice que sed debería admitir la entrada -estándar estándar si el implementador quiere -decir entrada estándar ???)
Otra forma es manejar el contenido agregado en orden. Hay otro comando que programa la salida de la misma manera que read, y la sedaplicará y read en el orden en que están escritas. Sin embargo, es un poco más complicado: implica usar uno sedpara aagregar la Pointercoincidencia a la salida de otro seden su script.
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
Entonces, básicamente, el primero sedescribe el segundo sedun script, que el segundo sedlee en entrada estándar (tal vez ...) y se aplica a su vez. El primero sedsolo funciona en la primera coincidencia para Pointerencontrado, y luego qingresa. Su trabajo es ...
s/[]^$&\./*[]/\\&/g;H
- Asegúrese de que todos los caracteres del patrón tengan una barra invertida sin escape porque el segundo
sedtendrá que interpretar cada bit que lee literalmente para hacerlo bien. Una vez hecho esto, coloque una copia en el Hespacio antiguo.
s|.*|/&/!p;//!d|p; x
- Dígale al segundo
sedque pborre cada línea de entrada, !excepto la /&/que acabamos de guardar con patrones; y luego delegir todo lo mismo. pborre los comandos en el segundo sed, luego xcambie los hbúferes antiguos y de patrones para que funcionen en nuestra copia guardada.
s|.|r file1&a\\&|p;q
- El único
\npersonaje con el que trabajamos aquí es un ewline porque sedhabrá antepuesto uno cuando Heludimos la línea antes. Entonces, insertamos el comando r file1y lo seguimos con nuestra línea \nelectrónica, luego el comando a\\para append seguido también por una línea \nelectrónica. Todo el resto de nuestra Hlínea de campo sigue esa última \nlínea.
El guión que escribe el primero se parece a esto:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Básicamente, el segundo sedimprimirá cada línea, pero la primera la sedconfigurará para apasar. Por esa particular línea de dos escrituras con retraso a la salida estándar están programados - el primero es el read de file1y el segundo es una copia de la línea que queremos después de ella. El primer sedcuidado no es necesario en este caso (¿ve? No hay barras invertidas) pero es importante escapar de manera segura como lo hago aquí cada vez que una coincidencia de patrón se reutiliza como entrada.
De todos modos, entonces ... hay algunas maneras.