Substituir string pelo conteúdo de um arquivo usando sed

22

Eu tenho dois arquivos diferentes:

Arquivo1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

Arquivo2

<TEXT1>
<TEXT2>

Eu quero substituir o <TEXT1> de Arquivo2 pelo conteúdo de Arquivo1 usando sed . Eu tentei este comando, mas não obtive a 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.

    
por chanchal1987 08.09.2011 / 16:20

3 respostas

22

Aqui está uma solução de script sed (mais fácil para os olhos do que tentar colocá-lo em uma linha na linha de comando):

/<TEXT1>/ {
  r File1
  d
}

Executando:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>
    
por 08.09.2011 / 16:48
8

Demorei muito tempo para encontrar essa solução usando a substituição de var. Todas as soluções sed não funcionaram para mim, pois elas excluem linhas completas ou substituem incorretamente.

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

Substitui todas as ocorrências de TEXT1 no arquivo2 pelo conteúdo do arquivo1. Todos os outros textos permanecem intocados.

    
por 26.10.2014 / 10:27
7

Eu respondo porque o método diff / patch pode ser interessante em alguns casos. Para definir uma substituição de linhas contidas no arquivo blob1 por linhas contidas em blob2 use:

diff -u blob1 blob2 > patch-file

Por exemplo, se blob1 contiver:

hello
you

e blob2 contém:

be
welcome
here

o patch-file gerado será:

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

Agora, você pode aplicar este patch a qualquer outro arquivo:

patch somefile patch-file

Ele substituirá hello , you linhas por be , welcome , here linhas em somefile .

    
por 08.09.2011 / 17:11

Tags