Como inserir texto após uma determinada seqüência de caracteres em um arquivo?

69

No momento estou usando echo "Hello World" >> file.txtpara anexar algum texto a um arquivo, mas também preciso adicionar texto abaixo de uma determinada string, digamos "[opção]", é possível sed?

POR EXEMPLO:

Arquivo de entrada

Some text
Random
[option]
Some stuff

Arquivo de saída

Some text
Random
[option]
*inserted text*
Some stuff
Javier Villanueva
fonte
11
Você precisa ser mais específico e fornecer um texto de exemplo para que as pessoas o ajudem com os comandos exatos.
clement
edite você Q e mostre inputas outputlinhas e. Porque você Q não está claro. Você também pode fazer echo "Hello World [option]" >> file.txt, mas não faz sentido.
Eu editei a questão para fornecer mais informações para referência, mas a resposta aceita foi o que eu estava tentando realizar
Javier Villanueva
Se você só quer editar um arquivo de configuração esta é a melhor solução que eu encontrei: unix.stackexchange.com/a/78076/20661
rubo77

Respostas:

104

Anexar linha após partida

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

Inserir linha antes da partida

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

Além disso, você pode fazer backup e editar o arquivo de entrada no local usando a -i.bkpopção sed

Rahul Patil
fonte
2
no osx eu recebosed: 1: "/pattern/a some text here": command a expects \ followed by text
the_prole 20/01
para Mac OSX, eu precisava adicionar \ <<NEWLINE>>após a aopção
Tom Howard
O código acima irá acrescentar / inserir a linha para cada partida. Se você quiser acrescentar / inserir a linha apenas para a primeira partida, você pode acrescentar 0,os comandos: sed '0,/\[option\]/a Hello World' inputoused '0,/\[option\]/i Hello World' input
kimbaudi
33

Sim, é possível com sed:

sed '/pattern/a some text here' filename

Um exemplo:

$ cat test
foo
bar
option
baz
$ sed '/option/a insert text here' test
foo
bar
option
insert text here
baz
$
devnull
fonte
2
@javiervd Não sei ao certo o que você quis dizer com primeira resposta? Se você quis dizer primeiro com o tempo respondido, está enganado. Você não observou os carimbos de hora com cuidado!
devnull
Existe uma maneira de adicioná-lo após a correspondência mais recente da string? Por exemplo: foo bar option bar option baz . Então o padrão se tornou foo bar option bar option addedstring baz ?
Ari #
4

Com awk:

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

Lembre-se de que alguns caracteres não podem ser incluídos literalmente; portanto, é necessário usar seqüências de escape (elas começam com uma barra invertida), por exemplo, para imprimir uma barra invertida literal que é preciso escrever \\.

Na verdade, é o mesmo com, sedmas além disso, cada nova linha incorporada no texto deve ser precedida por uma barra invertida:

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

Para mais detalhes sobre seqüências de escape, consulte o manual.

don_crissti
fonte
Uma linha awk na verdade não altera o texto, apenas a saída.
Josef Klimuk