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 File2
contenido 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 File1
en File2
antes de la línea que contiene "Pointer".
text-processing
awk
sed
perl
usuario1228191
fuente
fuente
Respuestas:
sed
tiene 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-n
al principio.Sin usar
sed
oawk
...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 unased
deawk
solución.fuente
awk
hace 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
Pointer
línea, simplemente cambie el orden de los patrones (necesita agregar un punto y coma para obtener la acción predeterminada), y puede soltar laline
variable:Y solo porque nadie lo ha usado
perl
todavía,fuente
system("cat innerfile")
da salidainnerfile
a la consola. ¿Me estoy perdiendo de algo?Un trabajo fácil para
ed
:-r file1
lee 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 defile2
una sola vez, incluso siPointer
ocurre en varias líneas. Si desea insertarlo antes de cada línea coincidente, agregue lag
bandera lobal:Reemplace
,p
conw
si desea editar el archivo en el lugar.La
sed
respuesta 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 contenidoFile1
después del marcador.Inicialmente he intentado con:
que también funciona bien (como
r
lo hará su magia al final del ciclo) pero tiene el mismo problema si el marcador está en la última línea (no hay unaN
línea ext después de la última línea). Para evitar eso, puede agregar una nueva línea a su entrada:Esto insertará
file2
contenido antes de cada línea coincidente. Para insertarlo solo antes de la primera línea coincidente, puede usar unl
oop y simplemente jalar lan
línea de extensión hasta llegar al final del archivo:Con estas
sed
soluciones, 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
N
que incrementa el ciclo de la línea y elr
comando ead se aplica por número de línea.Puedes evitarlo:
No todos los
sed
s interpretarán el-
significado de entrada estándar, pero muchos lo hacen. ( POSIX dice quesed
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
r
ead, y lased
aplicará yr
ead en el orden en que están escritas. Sin embargo, es un poco más complicado: implica usar unosed
paraa
agregar laPointer
coincidencia a la salida de otrosed
en su script.Entonces, básicamente, el primero
sed
escribe el segundosed
un script, que el segundosed
lee en entrada estándar (tal vez ...) y se aplica a su vez. El primerosed
solo funciona en la primera coincidencia paraPointer
encontrado, y luegoq
ingresa. Su trabajo es ...s/[]^$&\./*[]/\\&/g;H
sed
tendrá que interpretar cada bit que lee literalmente para hacerlo bien. Una vez hecho esto, coloque una copia en elH
espacio antiguo.s|.*|/&/!p;//!d|p; x
sed
quep
borre cada línea de entrada,!
excepto la/&/
que acabamos de guardar con patrones; y luegod
elegir todo lo mismo.p
borre los comandos en el segundosed
, luegox
cambie losh
búferes antiguos y de patrones para que funcionen en nuestra copia guardada.s|.|r file1&a\\&|p;q
\n
personaje con el que trabajamos aquí es un ewline porquesed
habrá antepuesto uno cuandoH
eludimos la línea antes. Entonces, insertamos el comandor file1
y lo seguimos con nuestra línea\n
electrónica, luego el comandoa\\
paraa
ppend seguido también por una línea\n
electrónica. Todo el resto de nuestraH
línea de campo sigue esa última\n
línea.El guión que escribe el primero se parece a esto:
Básicamente, el segundo
sed
imprimirá cada línea, pero la primera lased
configurará paraa
pasar. Por esa particular línea de dos escrituras con retraso a la salida estándar están programados - el primero es elr
ead defile1
y el segundo es una copia de la línea que queremos después de ella. El primersed
cuidado 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
$x
en 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
N
funciona bien, pero no si el PATRÓN coincide con la última línea de entradafuente