File1 contenido:
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
File2 contenido:
line1-file2 "25"
line2-file2 "24"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
Después de la ejecución del script perl / shell, el File2contenido debería convertirse en:
line1-file2 "25"
line2-file2 "24"
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
es decir, pegar el contenido de File1en File2antes de la línea que contiene "Pointer".
text-processing
awk
sed
perl
usuario1228191
fuente
fuente

Respuestas:
sedtiene una función para eso y puede hacer la modificación en línea:Pero esto pone su línea de puntero sobre el archivo1. Para ponerlo a continuación, retrase la salida de línea:
fuente
-e 1x -e '2,${x;p}' -e '${x;p}'hacer? Entiendo que intercambias cosas en el búfer de patrones y luego las imprimes, pero no sé qué ni por qué agregaste la opción silenciosa-nal principio.Sin usar
sedoawk...Primero, encuentre la línea en la que se encuentra su patrón:
Luego, use 3 comandos para generar el resultado deseado:
Esto tiene el inconveniente de acceder a 3 veces el archivo
file2, pero podría ser más claro que unaseddeawksolución.fuente
awkhace que esto sea bastante fácil.Inserte la línea antes del archivo:
Para hacer que el archivo interno se imprima después de la
Pointerlínea, simplemente cambie el orden de los patrones (necesita agregar un punto y coma para obtener la acción predeterminada), y puede soltar lalinevariable:Y solo porque nadie lo ha usado
perltodavía,fuente
system("cat innerfile")da salidainnerfilea la consola. ¿Me estoy perdiendo de algo?Un trabajo fácil para
ed:-r file1lee en el archivo especificado después de la línea direccionada, que en este caso es la línea anterior a la primera coincidencia de líneaPointer. Entonces esto insertará el contenido defile2una sola vez, incluso siPointerocurre en varias líneas. Si desea insertarlo antes de cada línea coincidente, agregue lagbandera lobal:Reemplace
,pconwsi desea editar el archivo en el lugar.La
sedrespuesta aceptada funciona para la mayoría de los casos, pero si el marcador está en la última línea, el comando no funcionará como se esperaba: insertará el contenidoFile1después del marcador.Inicialmente he intentado con:
que también funciona bien (como
rlo hará su magia al final del ciclo) pero tiene el mismo problema si el marcador está en la última línea (no hay unaNlínea ext después de la última línea). Para evitar eso, puede agregar una nueva línea a su entrada:Esto insertará
file2contenido antes de cada línea coincidente. Para insertarlo solo antes de la primera línea coincidente, puede usar unloop y simplemente jalar lanlínea de extensión hasta llegar al final del archivo:Con estas
sedsoluciones, pierde la capacidad de editar en el lugar (pero puede redirigir a otro archivo).fuente
Use un bucle para leer las líneas en el archivo2. Si encuentra una línea que comienza con
Pointer, imprima el archivo1. Esto se muestra a continuación:fuente
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:... 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
Nque incrementa el ciclo de la línea y elrcomando ead se aplica por número de línea.Puedes evitarlo:
No todos los
seds interpretarán el-significado de entrada estándar, pero muchos lo hacen. ( POSIX dice queseddeberí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 lasedaplicará yread en el orden en que están escritas. Sin embargo, es un poco más complicado: implica usar unosedparaaagregar laPointercoincidencia a la salida de otroseden su script.Entonces, básicamente, el primero
sedescribe el segundosedun script, que el segundosedlee en entrada estándar (tal vez ...) y se aplica a su vez. El primerosedsolo funciona en la primera coincidencia paraPointerencontrado, y luegoqingresa. Su trabajo es ...s/[]^$&\./*[]/\\&/g;Hsedtendrá que interpretar cada bit que lee literalmente para hacerlo bien. Una vez hecho esto, coloque una copia en elHespacio antiguo.s|.*|/&/!p;//!d|p; xsedquepborre cada línea de entrada,!excepto la/&/que acabamos de guardar con patrones; y luegodelegir todo lo mismo.pborre los comandos en el segundosed, luegoxcambie loshbúferes antiguos y de patrones para que funcionen en nuestra copia guardada.s|.|r file1&a\\&|p;q\npersonaje con el que trabajamos aquí es un ewline porquesedhabrá antepuesto uno cuandoHeludimos la línea antes. Entonces, insertamos el comandor file1y lo seguimos con nuestra línea\nelectrónica, luego el comandoa\\paraappend seguido también por una línea\nelectrónica. Todo el resto de nuestraHlínea de campo sigue esa última\nlínea.El guión que escribe el primero se parece a esto:
Básicamente, el segundo
sedimprimirá cada línea, pero la primera lasedconfigurará paraapasar. Por esa particular línea de dos escrituras con retraso a la salida estándar están programados - el primero es elread defile1y el segundo es una copia de la línea que queremos después de ella. El primersedcuidado 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.
fuente
Esto es bastante simple con AWK:
File1 en File2 antes de pattern = "Pointer"
Primero cargue el contenido de File1 en una variable
luego hacer la inserción
(O, si desea insertar File1 después de "Puntero")
fuente
Mi forma preferida: plantillas .
Esto reemplazará todos los changeme aparición en origfile con el contenido de file2insert . Retire el último g de sed para reemplazar solo la primera aparición de CAMBIO .
fuente
$xen su primer comando, cuando solo se define en su segundo comando?[Insertar el contenido del archivo en otro archivo ANTES del patrón]
[Después del patrón]
fuente
Nfunciona bien, pero no si el PATRÓN coincide con la última línea de entradafuente