¿Cómo insertar texto después de cierta cadena en un archivo?

69

En este momento estoy usando echo "Hello World" >> file.txtpara agregar texto a un archivo, pero también necesito agregar texto debajo de una cadena determinada, digamos "[opción]", ¿es posible con sed?

P.EJ:

Fichero de entrada

Some text
Random
[option]
Some stuff

Archivo de salida

Some text
Random
[option]
*inserted text*
Some stuff
Javier Villanueva
fuente
1
Debes ser más específico y dar un texto de muestra para que las personas te ayuden con los comandos exactos.
clemente
edite su Q y muestre inputlas outputlíneas y. Porque tu Q no está claro. También podrías hacerlo echo "Hello World [option]" >> file.txt, pero no tiene sentido.
Edité la pregunta para proporcionar más información para referencia, pero la respuesta aceptada fue lo que estaba tratando de lograr
Javier Villanueva,
Si solo desea editar un archivo de configuración, esta es la mejor solución que encontré: unix.stackexchange.com/a/78076/20661
rubo77

Respuestas:

104

Agregar línea después del partido

  • sed '/\[option\]/a Hello World' input

Insertar línea antes del partido

  • sed '/\[option\]/i Hello World' input

Además, puede hacer una copia de seguridad y editar el archivo de entrada en el lugar utilizando la -i.bkpopción sed

Rahul Patil
fuente
2
en osx consigosed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole
para Mac OSX, necesitaba agregar \ <<NEWLINE>>después de la aopción
Tom Howard
El código anterior agregará / insertará la línea para cada coincidencia individual. Si desea agregar / insertar la línea solo para la primera coincidencia, puede anteponer 0,los comandos: sed '0,/\[option\]/a Hello World' inputosed '0,/\[option\]/i Hello World' input
kimbaudi
33

Sí, es posible con sed:

sed '/pattern/a some text here' filename

Un ejemplo:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
devnull
fuente
2
@javiervd No estoy seguro de lo que quisiste decir con la primera respuesta. Si quisiste decir primero cuando respondiste, entonces te equivocas. ¡No observaste las marcas de tiempo con cuidado!
devnull
¿Hay alguna manera de agregarlo después de que coincida la última cadena? Por ejemplo: foo bar option bar option baz . ¿Entonces el patrón se vuelve foo bar option bar option addedstring baz ?
Ari
4

Con awk:

awk '1;/PATTERN/{ print "add one line"; print "\\and one more"}' infile

Tenga en cuenta que algunos caracteres no se pueden incluir literalmente, por lo que hay que usar secuencias de escape (comienzan con una barra diagonal inversa), por ejemplo, para imprimir una barra diagonal inversa que uno tiene que escribir \\.

En realidad es lo mismo, sedpero además cada nueva línea incrustada en el texto debe ir precedida de una barra invertida:

sed '/PATTERN/a\
add one line\
\\and one more' infile

Para más detalles sobre las secuencias de escape, consulte el manual.

don_crissti
fuente
Una línea awk en realidad no cambia el texto, solo la salida.
Josef Klimuk