¿Cómo inserto una línea en la parte superior de un archivo de texto usando la línea de comando?

25

Quiero insertar texto en la parte superior de un archivo ya existente. Cómo puedo conseguir esto. Lo intenté echoy teeno tuve éxito.

Intenté insertar una línea de repositorio en la parte superior del sources.listarchivo desde la terminal.

Nota

Necesito una solución rápida de una línea, porque ya conocía el método de otra respuesta

Anwar
fuente
1
tee agrega una línea en la parte inferior del archivo, por ejemplo echo "deb http://extras.ubuntu.com/ubuntu precise main" | sudo tee -a /etc/apt/sources.list, también necesita sudo before tee para obtener privilegios de administrador. Pero, ¿por qué querrías agregar algo en la parte superior de sources.list?
Savvas Radevic
2
@medigeek: en algún lugar en la historia de la pregunta de la OP que encontrará algo acerca de la instalación / actualización desde un CD-repo ... Sospecho que puede ser la razón ...
ish
Gracias @izx, su suposición es correcta. Estoy tranquilo impresionado. ¿Puedes también responder esa pregunta? Se trataba de instalar desde un repositorio local usando el centro de software y también configurar mi repositorio local para la máxima prioridad sin colocarlo en la parte superior. Gracias de nuevo.
Anwar
1
@izx, Aquí está el enlace para establecer la máxima prioridad para mi repositorio local. Estaré encantado si también puede consultar esta pregunta sobre el centro de software . Gracias de nuevo por tu primer comentario. estaba muy contento
Anwar
1
@medigeek, puede ver esta pregunta para la explicación de una pregunta tan poco común.
Anwar

Respuestas:

38

En realidad es bastante fácil con sed:

  • sed -i -e '1iHere is my new top line\' filename

  • 1ile dice a sed que inserte el texto que sigue en la línea 1 del archivo; no olvide la \nueva línea al final para que la línea 1 existente se mueva a la línea 2.

ish
fuente
1
Gracias. Solo para la nota: si desea reemplazar, en lugar de insertar, use en slugar de i in 1i.
Anwar
3
Lamentablemente, esto falla para el archivo vacío (no tiene línea de puño, por lo que sed nunca se inserta).
Tino
@Tino Para archivos vacíos que puedes usarecho "Text Here" >> Filename
Flotolk
no funciona en MacOS 10
Krishna
7

En edición general en su lugar con un guión es complicado, pero se puede utilizar echoy cata continuación,mv

echo "fred" > fred.txt
cat fred.txt t.txt >new.t.txt
# now the file new.t.txt has a new line "fred" at the top of it
cat new.t.txt
# can now do the rename/move
mv new.t.txt t.txt

Sin embargo, si está jugando con sources.list, necesita agregar un poco de validación y prueba de balas para detectar errores, etc., porque realmente no desea perder esto. Pero esa es una pregunta separada :-)

Sean
fuente
Ya puedo hacer eso. Necesito una solución de una línea como izx dio. Sin embargo, gracias por su respuesta.
Anwar
1
@AnwarShah: ¡ah, lo siento! Deberías haber dicho eso en tu pregunta :-)
Sean
Admito, +1 por tu respuesta y también por tu comentario. (No puedo dar más)
Anwar
6
./prepend.sh "myString" ./myfile.txt

sabido que prependes mi shell personalizado :

#!/bin/sh
#add Line at the top of File
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

Utilice también una ruta relativa o absoluta, debería funcionar bien:

./prepend.sh "my New Line at Top"  ../Documents/myfile.txt

Actualización:

si desea un script permanente para esto, abra y nano /etc/bash.bashrcluego agregue esta función al final del archivo:

function prepend(){
# @author Abdennour TOUMI
if [ -e $2 ]; then
    sed -i -e '1i$1\' $2
fi

}

Vuelva a abrir su terminal y disfrute:

prepend "another line at top" /path/to/my/file.txt
Abdennour TOUMI
fuente
5

¿Y por qué no usar un editor de texto genuino para eso? ed es el editor de texto estándar.

ed -s filename <<< $'1i\nFIRST LINE HERE\n.\nwq'

O, si desea que los comandos sean más legibles:

ed -s filename < <(printf '%s\n' 1i "FIRST LINE" . wq)
  • 1: ir a primera línea
  • i: modo de inserción
  • tus cosas que quieres insertar ...
  • .: deja de insertar, vuelve al modo normal
  • wq: escribe y renuncia, gracias, adiós.
gniourf_gniourf
fuente
¿Cómo usar la sustitución de variables de shell (en el FIRST LINE) con esto?
vp_arth
1
@vp_arth Si su contenido es en la variable first_linea continuación: ed -s filename < <(printf '%s\n' 1i "$first_line" . wq). Asegúrese de que la variable no se expanda a un solo punto y que no contenga ningún carácter de nueva línea (desinfecte si proviene de la entrada del usuario).
gniourf_gniourf
3

Siempre existe la awkopción. Reemplazar stringvariable con sus contenidos. Sin embargo, este no es un cambio en el lugar. Personalmente, tiendo a no hacer cambios en el lugar. Esta es definitivamente una preferencia personal. Dos cosas, -vsignifica una variable en awk y la variable nse usa aquí para hacer coincidir un número de línea, efectivamente NR == 1. Puede usar esto de muchas maneras simplemente cambiando el valor de ny s.

string="My New first line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}'     file.source > file.target

Ejemplo:

% cat file.source                                                                                                                                      

First Line
Second Line
Third Line

% string="Updated First Line"; awk -v n=1 -v s="$string" 'NR == n {print s} {print}' file.source > file.target; cat ./file.target                      !698

Updated First Line
First Line
Second Line
Third Line
slashdot
fuente
2

Puede usar Vim en modo Ex:

ex -sc '1i|hello world' -cx sources.list
  1. 1 seleccione primera línea

  2. i insertar nueva línea de texto

  3. x guardar y cerrar

Steven Penny
fuente
Mucho más simple que otras soluciones proporcionadas hasta ahora. Gracias.
Pothi Kalimuthu