Eu tenho um arquivo de texto ( devel.xml
).
Adicionei a palavra REPLACETHIS para substituir esta string pelo conteúdo em um arquivo diferente ( temp.txt
).
A coisa mais próxima que tenho é esta:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Isso insere o conteúdo após a sequência e exclui a sequência posteriormente.
Esse é o melhor jeito de fazer isso?
text-processing
sed
perl
RafaelGP
fonte
fonte
Respostas:
O que você fez foi remover
SUBSTITUTETHIS
onde quer que ele apareça no arquivo (mas não o restante da linha em que aparece) e inserir o conteúdotemp.TXT
abaixo dessa linha. SeSUBSTITUTETHIS
aparecer várias vezes em uma linha, apenas a primeira ocorrência será removida e apenas uma cópiatemp.TXT
será adicionada.Se você deseja substituir a linha inteira quando
SUBSTITUTETHIS
aparecer, use od
comando Como você precisa executar os doisr
ed
quando houver uma correspondência, coloque-os em um grupo preparado.Algumas implementações sed permitem usar ponto-e-vírgula para separar comandos e omitir completamente os separadores entre chaves, mas você ainda precisa de uma nova linha para finalizar o argumento do
r
comando:Se você deseja substituir
SUBSTITUTETHIS
pelo conteúdo do arquivo, mas reter o que vem antes e depois na linha, é mais complicado. O método mais simples é incluir o conteúdo do arquivo no comando sed; observe que você precisará citar adequadamente seu conteúdo.Ou use Perl. Isso é curto, mas é executado
cat
uma vez para cada substituição:Para ler o arquivo uma vez quando o script iniciar, e evite depender de um comando do shell:
(apresentado em duas linhas para facilitar a leitura, mas você pode omitir a quebra de linha). Se o nome do arquivo for variável, para evitar problemas de citação, passe-o para o script por meio de uma variável de ambiente:
fonte
cat temp.txt
eu pudesse fazercat ${variable}
?-0777
opção slurp no arquivo inteiro, e uma maneira regularopen
:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
com mensagens como "BEGIN temp.TXT", "END temp.TXX"a
comando (adicionar). Grymoire.com/Unix/Sed.html#uh-36