He estado buscando un sedcomando para agregar texto a un archivo en una línea específica. Esto funciona agregando texto después de la línea 1:
sed '1 a\
Pero quiero agregarlo antes de la línea 1. Sería:
sed '0 a\
pero me sale este error: invalid usage of line address 0.
¿Cualquier sugerencia?
text-processing
command-line
sed
Manolo
fuente
fuente

Respuestas:
Use
sedlaiopción insert ( ) que insertará el texto en la línea anterior.Actualización del autor de la pregunta:
Para hacer que edite el archivo en su lugar, con GNU
sed, tuve que agregar la-iopción:También sintaxis
Para sed no GNU
Debe presionar la tecla de retorno inmediatamente después de la barra diagonal inversa
1i\y después defirst_line_text:También tenga en cuenta que algunas
sedimplementaciones que no son GNU (por ejemplo, la de macOS) requieren un argumento para el-iindicador (use-i ''para obtener el mismo efecto que con GNUsed).fuente
-iopción. Actualizaré tu respuesta antes de aceptar.sed '1 i\this text is entered above the existing first line' filefunciona para mí.sed (GNU sed) 4.2.2simplementesed '1 i text to insert' -i filefuncionó como un encanto. Graciasawkrespuesta mal clasificada a continuación. Esto debería funcionar.Echo se usa para obtener el texto. Nombre de archivo del gato: imprime el archivo en la consola y> lo usa para enviarlo a otro archivo nombre de archivo1 y luego movemos el nombre de archivo1 al nombre de archivo para insertar el texto en la primera línea del archivo deseado.
fuente
Puede usar Vim en modo Ex:
1seleccione primera líneaiinsertar texto y nueva líneaxguardar y cerrarfuente
Desea insertar texto antes de la primera línea en lugar de agregarlo después, así que use
Un documento aquí también puede ayudar:
fuente
Usando GNU awk> = 4.1:
Al contrario de todas las
sedrespuestas, esto también funciona en archivos vacíos.fuente
inplacees una biblioteca, y desafortunadamente aparece en todas las distribuciones awk que se envían. Me aparece "awk: fatal: no se puede abrir el archivo de código fuente" para su lectura "GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)Si no especifica la
-iopción, no mostrará ningún error y mostrará la salida en el terminal estándar, pero no insertará el texto en el archivo.fuente
-icambio.gnu sedespecíficos y sucede quegnu sedaceptaráisin una barra invertida). Si otros piensan que esto justifica una respuesta por separado + un voto positivo ... oh, bueno.El
0acomando se ha intentado no funciona enex, el predecesor devi:El
printfcomando por sí mismo genera:Los
0amedios se agregan después de la línea 0 (es decir, antes de la primera línea).La siguiente línea o líneas múltiples es texto literal que se agregará.
El
.en una línea por sí solo termina el comando "agregar".Las
xcausas Ex para guardar los cambios en el archivo y salir.fuente
Me sorprende que en esta vieja pregunta nadie haya mostrado el comando sed más común (y bastante simple en este caso):
Que funciona en la mayoría de los depósitos y es portátil para varias versiones sed.
Si GNU sed está disponible, puede usar esto:
La diferencia es que GNU sed permite el uso de a
\npara una nueva línea y otros necesitan una nueva línea literal precedida por una barra diagonal inversa (que también funciona en GNU sed de todos modos).Si se
$'…'está utilizando un shell que acepta la sintaxis, puede insertar la nueva línea directamente, de modo que sed vea que la nueva línea ya está allí:Que funciona para más versiones sed.
fuente
Desafortunadamente, todas las respuestas anteriores (principalmente con
sed) no funcionaron para mí, ya que todas sustituyeron la primera línea. Estoy en unaUbuntu 16.04 LTSmaquina. Aquí está mi solución conGNU Awk 4.0.2:fuente
sedrespuesta que usa reemplazo pero no sustituye la línea existente.Primero y último
Supongo que cualquiera que haya buscado cómo insertar / agregar texto al principio / al final de un archivo probablemente también necesite saber cómo hacer el otro.
Explicación
Esta
calsalida se canaliza a gnu-sed(llamadogseden macOS instalado a través de brew.sh ) con RegEx extendido (-E) y 6 "scripts" aplicados (-e) y los saltos de línea se escapan\para facilitar la lectura. Las secuencias de comandos 1 y 2 se usan1i\para "en la línea 1, insertar". Las secuencias de comandos 5 y 6 se usan$a\para "en la línea <última>, anexar". Alineé verticalmente las salidas de texto para hacer que el código represente lo que se espera en el resultado. Los guiones 3 y 4 hacen sustituciones (esta última se aplica solo a "línea <última>"). El resultado es convertir la salida del comando a JSON válido.salida
fuente
1ipara insertar texto antes de la primera línea. Alguien con esta pregunta tendría que extraer las partes que necesita de su respuesta para resolver su problema. Las preguntas son gratuitas, por lo que le invito a que haga y responda su propia pregunta para proporcionar su respuesta específica.