tac a | sed '0,/Banana/{s/Banana/Orange\nBanana/}' | tac
Vai fazer isso!
EDIT: Modificado a partir da resposta a essa pergunta - link
Eu gostaria de inserir uma string após a última correspondência, por exemplo:
String para inserir após a última instância da banana: Orange
Entrada
Apple
Banana
Apple
Banana
Resultado
Apple
Banana
Apple
Banana
Orange
Estou tentando fazer isso com tags XML. Eu já trabalhei como adicionar a tag de início.
tac a | sed '0,/Banana/{s/Banana/Orange\nBanana/}' | tac
Vai fazer isso!
EDIT: Modificado a partir da resposta a essa pergunta - link
Curto e simples, para fazer exatamente o que foi perguntado:
printf '%s\n' '0?Banana?a' Orange . x | ex file.txt
Se você preferir ver o que será salvo no arquivo (em vez de salvar as modificações imediatamente), use:
printf '%s\n' '0?Banana?a' Orange . %p | ex file.txt
O que isso faz:
Desde o início do arquivo ( 0
), procure para trás ( ?regex?
) para a próxima instância (envolvente) de "Banana" e, em seguida, anexe ( a
) linha "Laranja". O período finaliza o acréscimo e o x
salva e sai.
sed -e:n -e'/\n.*Banana/!{$!{N' \
-e'/Banana/bn' -eb -e\}\
-e's/\n/&Orange&/;t' \
-e'/Banana/a\' -eOrange\
-e\} -e'P;D' <<\IN
Apple
Banana
Apple
Banana
IN
Apple
Banana
Apple
Banana
Orange
Isso deve funcionar de forma bastante confiável. Ele armazenará em buffer no espaço de padrões entre ocorrências de Banana
na entrada - imprimindo para stdout todo o último grupo de buffers quando um novo é correspondido. E a última ocorrência de Banana
deve ser tratada corretamente, independentemente de onde ocorra na entrada. E não precisa ler todo o seu arquivo de entrada antes de escrever qualquer saída.
Tags bash text-processing scripting