Eu tenho um arquivo sample.txt
assim:
lots of text
lots of text
#nvram = [
# these
# could
# be,
# anything
#]
lots of text
lots of text
e quero adicionar algum texto "foobar" para obter isso:
lots of text
lots of text
#nvram = [
# these
# could
# be,
# anything
#]
foobar
lots of text
lots of text
Eu olhei alguns tópicos relacionados e tentei um monte de coisas, mas não consegui juntar as informações da maneira correta.
correspondência de várias linhas: Como posso usar sed ou ex para substituir um bloco (código de várias linhas) por um novo bloco de texto (código)? https://stackoverflow.com/questions/11234001/replace-multiple-lines-using-sed Como posso usar o sed para substituir uma string de várias linhas?
anexando: Como adicionar uma nova linha após a "mensagem de teste1" usando sed?
Eu tenho tentado coisas assim:
sed '/^#nvram = \[$/{
N
^.*$
}/abc123/' sample.txt
sed '/^#nvram = \[$/ {N; s/\<^#nvram = \[$\>\n<^.*$\>/abc123/g}' sample.txt
sed '/^#nvram = \[$/ {N; s/\<#nvram = \[\>\n\<.*\>/abc123/g}' sample.txt
sed '/^#nvram = \[$/ {N; s/#nvram = \[\n.*/abc123/g}' sample.txt
sed '/^#nvram = \[$/ {N; /#nvram = \[\n.*/abc123/a}' sample.txt
sed '/^#nvram = \[$/ {N; /#nvram = \[(\n.*){1,}/abc123/a}' sample.txt
sed '/^#nvram = \[$/!b;n;cABC' sample.txt
sed '/^#nvram = \[$/N;cABC' sample.txt
sed '/^#nvram = \[$/N/#\]/a;cABC' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!{s/./abc/g}}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!{/abc/a}}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/!/a abc}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/;/a abc}' sample.txt
sed '/^#nvram = \[$/,/#\]/{/^#nvram = \[$/n;/#\]/a abc}' sample.txt
Mas até agora não consegui.
Que tal usar um laço?
Explicação:
Pelo menos no GNU sed, isso pode ser escrito como uma linha
Com GNU sed para
-z
:Você pode precisar ajustar o regexp dependendo do que você realmente quer dizer com "qualquer coisa" (por exemplo, pode conter um
]
) e se você tem ou não outros blocos semelhantes em seu arquivo.Isso seria mais robusto, por exemplo, se
anything
não incluir]
s e você tiver outros blocos semelhantes em sua entrada:Vou escolher uma das abordagens que você usou e mostrar como fazer isso funcionar, para que ressoe e também permaneça com você:
Eu pessoalmente não gosto do acima e faço um pouco diferente:
Aqui está também um sed simples:
Ele encontra uma linha em que o
#nvram = [
ocorreu e todas as linhas depois disso e até que a primeira ocorrência de an#]
seja endereçada, então você substitui o#]\nfoobar
por#]
.