¿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

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


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
$

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.


Una línea awk en realidad no cambia el texto, solo la salida.
Josef Klimuk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.