
Utilizo sed -n '/string/,$p' file >> otherfile
para copiar texto de una línea con cierta cadena a otro archivo.
Ahora quiero que el texto copiado se elimine en el archivo original. Probé diferentes métodos con sed y awk pero nada funcionó.
¿Cómo usar sed para eliminar el texto de un archivo desde la línea inicial que contiene una determinada cadena?
texta
texta1
textb <- string, delete rest of the text from here
textb1
textc
textc1
¿O sería más fácil cortar en lugar de copiar con sed y cuál sería el comando en su lugar?
Respuesta1
PuedewEscriba un rango direccionado de líneas en un nuevo archivo y luegodelimine el rango: la parte complicada es evitar que el d
comando sea tratado como parte del nombre del archivo de salida. En GNU sed, puedes hacerlo dividiendo la escritura y la eliminación en expresiones separadas usando-e
NOTA IMPORTANTE: esto se truncará otherfile
en lugar de agregarse
sed -i.bak -e '/string/,${w otherfile' -e 'd;}' file
Respuesta2
¡O usa ed!
ed -s file <<< $'/textb/,$w otherfile\n/textb/,$d\nw\nq'
Dada su opiniónarchivode:
texta
texta1
textb <- string, delete rest of the text from here
textb1
textc
textc1
Después de ejecutar el ed
comando,archivose convierte en:
texta
texta1
(hay una línea en blanco al final que desaparece en el formato aquí); yotro archivocontiene:
textb <- string, delete rest of the text from here
textb1
textc
textc1
Los ed
comandos son:
/textb/,$w otherfile
- escribe ese rango de líneas enotro archivo/textb/,$d
- eliminar ese rango de líneasw
-- escribe el archivo modificado en el discoq
-- renunció
Respuesta3
Si usas este comandosed -n '/string/,$p' file >> otherfile
para extraer todas las líneas de unaque contiene string
hasta el final del archivo ( $
) a otro archivo.
La forma más sencilla de extraer el complemento de that es complementar la coincidencia:
sed '/string/,$d' file >> someOtherDifferentFile
Y si desea o necesita actualizar el archivo original, simplemente copie el resultado.
Que es lo que -i
hace la opción sed, por lo que actualizará el archivo original:
sed -i.bak '/string/,$d' file