Eu tenho dois arquivos diferentes:
Arquivo1
/home/user1/
/home/user2/bin
/home/user1/a/b/c
Arquivo2
<TEXT1>
<TEXT2>
Eu quero substituir o <TEXT1>
do File2 com o conteúdo do File1 usando sed
. Eu tentei este comando, mas não obtendo saída adequada:
cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"
Você também pode usar outras ferramentas para resolver esse problema.
sed
implementação você está usando. Seu código funciona para mim com o GNUsed
./home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>
. Não recebendo novas linhas.diff
epatch
permitem substituir algumas linhas em um arquivo por outras com bastante facilidade.$()
em um script sed faz meus olhos sangrarem. Nunca use dados externos em locais onde alguns caracteres são interpretados com significado especial.Respostas:
Aqui está uma solução de script sed (mais fácil para os olhos do que tentar colocá-la em uma linha na linha de comando):
Executando:
fonte
sed '/<TEXT1>/{rFile1^Md^M}' File2
onde "^ M" é você pressionando return. O problema é que o sed realmente precisa das novas linhas dentro do {...} para delimitar os comandos re d.sed $'/<TEXT1>/ {r File1\n d}'
sed -e '/<TEXT1>/{r File1' -e 'd}' File2
<TEXT1>
, eu apenas quero substituir a própria string, deixando o resto da linha intacta?Text1: <TEXT1>
paraText1: <file_contents>
.Levei muito tempo para encontrar esta solução usando a substituição de var. Todas as soluções sed não funcionaram para mim, pois excluem linhas completas ou substituem incorretamente.
Substitui todas as ocorrências de TEXT1 no arquivo2 pelo conteúdo do arquivo1. Todo o outro texto permanece intocado.
fonte
sed
também, uma vez que essas "expansões" (também conhecidas como substituições) são incorporadas ao shell (bash
pelo menos)Eu respondo porque o método
diff
/patch
pode ser interessante em alguns casos. Para definir uma substituição de linhas contidas no arquivoblob1
por linhas contidas emblob2
uso:Por exemplo, se
blob1
contém:e
blob2
contém:o gerado
patch-file
será:Agora, você pode aplicar esse patch a qualquer outro arquivo:
Ele irá substituir
hello
,you
linhas porbe
,welcome
,here
linhas emsomefile
.fonte