¿Cómo insertar texto antes de la primera línea de un archivo?

76

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?

Manolo
fuente
stackoverflow.com/questions/15157659/…
Léo Léopold Hertz 준영

Respuestas:

102

Use sedla iopción insert ( ) que insertará el texto en la línea anterior.

sed '1 i\

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:

sed -i '1 i\anything' file

También sintaxis

sed  -i '1i text' filename

Para sed no GNU

Debe presionar la tecla de retorno inmediatamente después de la barra diagonal inversa 1i\y después de first_line_text:

sed -i '1i\
first_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 GNU sed).

sospechoso
fuente
1
No funciona sin -iopción. Actualizaré tu respuesta antes de aceptar.
Manolo
1
Gracias. ¿Qué sistema operativo estás usando? La solución original funcionó en OpenSuse 9.
sospecha el
1
¡Interesante! Estoy en Lubuntu 13.10 y sed '1 i\this text is entered above the existing first line' filefunciona para mí.
2
Aquí, usar sed (GNU sed) 4.2.2simplemente sed '1 i text to insert' -i filefuncionó como un encanto. Gracias
ton
1
@FeRD Vea mi awkrespuesta mal clasificada a continuación. Esto debería funcionar.
rudimeier
18

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.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename
Ankit Shah
fuente
77
Por favor, hágame saber por qué se vota abajo
Ankit Shah
1
Quizás porque el OP menciona sed. Eso no merece un voto negativo en mi opinión. Esa solución fue incluso la que mejor se ajustaba a mis necesidades, y luego voté.
рüффп
Yo voté a favor. funciona en ksh para mí
arcee123
17

Puede usar Vim en modo Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 seleccione primera línea

  2. i insertar texto y nueva línea

  3. x guardar y cerrar

Steven Penny
fuente
7

Desea insertar texto antes de la primera línea en lugar de agregarlo después, así que use

sed '1 i\
your_text' your_file

Un documento aquí también puede ayudar:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI
Joseph R.
fuente
6

Usando GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

Al contrario de todas las sedrespuestas, esto también funciona en archivos vacíos.

rudimeier
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)
vossad01
6
sed  -i '1i new_text' file_name

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.

devi.
fuente
La pregunta no es sobre el -icambio.
don_crissti
¿Cómo te imaginas eso? Que es una respuesta a la pregunta. Sí, es similar a la respuesta aceptada, pero no exactamente la misma.
G-Man
@ G-Man - Se podría argumentar la plantilla utilizada por el CAS es lejos de ser ideal, pero en realidad, esto es semejante al igual que en casi idénticos ... con la diferencia de la distancia y el hecho de que éste tiene ninguna barra invertida. En lo que a mí respecta, son técnicamente idénticos (ya que ambos son gnu sedespecíficos y sucede que gnu sedaceptará isin una barra invertida). Si otros piensan que esto justifica una respuesta por separado + un voto positivo ... oh, bueno.
don_crissti
2

El 0acomando se ha intentado no funciona en ex, el predecesor devi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

El printfcomando por sí mismo genera:

0a
Anything you want to add
.
x

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.

Comodín
fuente
1

Me sorprende que en esta vieja pregunta nadie haya mostrado el comando sed más común (y bastante simple en este caso):

$ sed  -i '1s/^/new_text\
/' file_name

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:

$ sed -i '1s/^/new_text\n' file_name

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í:

$ sed -i $'1s/^/new_text\\\n/' file_name

Que funciona para más versiones sed.

Isaac
fuente
-1

Desafortunadamente, todas las respuestas anteriores (principalmente con sed) no funcionaron para mí, ya que todas sustituyeron la primera línea. Estoy en una Ubuntu 16.04 LTSmaquina. Aquí está mi solución con GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name
Splinter479
fuente
1
No estoy seguro de lo que estás hablando ... Solo hay una sedrespuesta que usa reemplazo pero no sustituye la línea existente.
don_crissti
-2

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.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

Explicación

Esta calsalida se canaliza a gnu- sed(llamado gseden 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 usan 1i\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

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}
Bruno Bronosky
fuente
Si bien no he votado su pregunta, tenga en cuenta que ya tenemos varias respuestas, incluida una aceptada, que demuestran el resultado deseado.
Jeff Schaller
@JeffSchaller La comunidad de Stack Exchange no es un foro. Su propósito se extiende más allá de ayudar a que el OP se desbloquee. El objetivo es sembrar la base de conocimiento global con muchas opciones que los buscadores pueden encontrar al buscar respuestas. La razón por la que titulé mi respuesta es para ayudar a los usuarios a reconocer la utilidad de esta respuesta incluso antes de que hagan clic en el resultado de Google.
Bruno Bronosky
Lo que digo es que su respuesta no proporciona nuevas opciones (respuestas) para futuros lectores de esta pregunta. Ya tenemos cuatro respuestas que usan variaciones de 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.
Jeff Schaller