SED: ¿insertar texto después de la última línea?

77

El comando inserta una etiqueta al comienzo de un archivo:

sed -i "1s/^/<?php /" file

¿Cómo puedo insertar algo al final de cada archivo con SED?

don_crissti
fuente
3
{ cat file; echo 'END OF FILE'; } > newFile , esto también funciona gracias a sh. *. (no sed, pero funciona y simple)
44
un simple echo "Cool Text" >> filetambién debería hacer el truco.
Danpe

Respuestas:

95

sed -e "\$aTEXTTOEND" Es la forma más sencilla.

Cómo funciona

$coincide con la última línea (es una seddirección normal ; 4aTEXTTOENDse insertaría después de la cuarta línea), aes el comando anexar y TEXTTOENDes qué agregar.

vendedor
fuente
Escape $ como $$ en un Makefile.
stevesliva
Para OS X sed -e '$a\NEWLINE\\'. Reemplace NEWLINE con una nueva línea real.
Jorge Bucaran
15
sed -i -e "\ $ aTEXTTOEND" <nombre de archivo> sería el comando completo.
Lasse Meyer
2
No estoy trabajando en macos. Ni siquiera el comentario de Jorge Bucarán: sed: 1: "$ a \ NEWLINE \\": caracteres adicionales después de \ al final de un comando
Emanuele Paolini
1
En debian 9 agrega una nueva línea en lugar de agregar al final de la última línea.
Luciano Andress Martini
31

No es necesario usar seden ese caso. Qué tal si

echo "<?php" >> file
innaM
fuente
2
Es cierto, pero puede adivinar que el caso de uso del OP está entre corchetes del archivo con " <php " y " >", y cita los contenidos seleccionados de una sola vez, por lo que probablemente realmente quiera un sedfragmento.
dmckee
2
Además, si va a hacer esto y no quiere una nueva línea, use echo -n
Vinko Vrsalovic
2
No me gusta adivinar Cada vez que lo intento, me equivoco.
44
Otra razón por la cual la respuesta aceptada es más útil es en el caso de anteponer esto sudo, lo que hace que esta variación falle ya que echoes un comando de shell incorporado en lugar de un archivo ejecutable que se encuentra en$PATH
Tony Cesaro
@TonyCesaro: echoes un built-in, pero es también un archivo ejecutable que se encuentra en$PATH
Zan Lynx
24

Suponiendo que desea poner la etiqueta php final a los archivos, luego

sed -i '$s/$/\n?>/' file

debería hacer el truco

Vinko Vrsalovic
fuente
1
Esto funciona muy bien en casos donde se desea la manipulación arbitraria de la última línea de entrada. ¡Gracias!
Jay Taylor
Una explicación descompuesta del comando sería muy apreciada
GGhe
3

Utilice el comando sed 'append (a)'. Por ejemplo, para agregar dos líneas al final del archivo:

sed -i -e '$a\
foo1 bar1\
foo2 bar2' file
user2802945
fuente
2

De una manera simple para escribir y hacer los cambios en los contenidos en una línea específica en un archivo. Si desea insertar algo en un número de línea específico, se puede usar el siguiente comando:

sed -i '2i i have started' sheikh.log

donde 2i- línea número 2 ei significa inserción. Si tiene que insertar en la última línea, use $en lugar de 2. He comenzado: el texto que se insertará y sheikh.loges el nombre del archivo.

También podemos hacer los cambios en la línea usando el siguiente comando

sed -i '2c we have started' sheikh.log

ise cambia a we.

jeque Mohammed Abdulla
fuente
-1

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 utilizan 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. Las secuencias de comandos 3 y 4 hacen sustituciones (la ú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