sed substituto de carga do arquivo [duplicado]

4

Estou tentando substituir um padrão em um arquivo pelo conteúdo completo de outro arquivo usando sed.

Atualmente estou usando:

sed "s/PATTERN/'cat replacement.txt'/g" "openfile.txt" > "output.txt"

No entanto, se o arquivo de substituição contiver algum caractere, como ' , " ou / , começar a receber erros devido à falta de sanitização da entrada.

Eu tenho tentado usar este guia para me ajudar, mas estou achando muito difícil de seguir. Se eu tentar o comando r file sugerido, acabo com uma string.

Qual é a melhor maneira de abordar isso?

    
por Sam 26.08.2014 / 05:05

4 respostas

4

Isso deve funcionar para você. Eu não votei para fechar como duplicado desde que você especificou que você tem ' , / e " caracteres em seu arquivo. Então, eu fiz o teste como abaixo.

Eu tenho file1 de conteúdo como abaixo.

cat file1
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.

Agora, file2 é como abaixo.

cat file2
This is file2
PATTERN 
After pattern contents go here. 

De acordo com o link compartilhado, criei o script.sed abaixo.

cat script.sed
/PATTERN/ {
  r file1
  d
}

Agora, quando executo o comando como sed -f script.sed file2 , obtenho a saída como

This is file2
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.
After pattern contents go here. 

EDIT : Isso funciona bem com vários padrões no arquivo também.

    
por 26.08.2014 / 05:25
1

Se você precisar de uma solução awk , poderá usar algo como abaixo.

 awk '/PATTERN/{system("cat file1");next}1' file2

Teste

cat file1
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.

Agora, tenho file2 como abaixo.

cat file2
This is file2
PATTERN 
After pattern contents go here.
PATTERN 

Agora, eu uso o comando awk acima mencionado.

Saída:

This is file2
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.
After pattern contents go here.
ramesh' has " and /
in this file
and trying
"to replace'
the contents in 
/other file.

Referências

link

    
por 26.08.2014 / 05:40
1

Em:

sed "s/PATTERN/'cat replacement.txt'/g" "openfile.txt"

' e " não devem ser um problema. Aqueles não são especiais para sed . O que deve ser um problema é & , \ , / e newline. Você pode escapar daqueles com outro comando sed :

sed "s/PATTERN/$(sed 's@[/\&]@\&@g;$!s/$/\/' replacement.txt)/g" openfile.txt

Observe que ele remove os caracteres de nova linha à direita em replacement.txt . Se isso não é que você quer, você pode fazer

replacement=$(sed 's@[/\&]@\&@g;s/$/\/' replacement.txt; echo .)
replacement=${replacement%.}
sed "s/PATTERN/$replacement/g" openfile.txt
    
por 26.08.2014 / 07:57
1

Com o% GNUsed você pode apenas e xecute cat em qualquer ponto do script que você gosta. Ao contrário de r - que programa para saída no final do ciclo de linha (o que pode ser muito frustrante!) , e funciona como i ou c em que escreve imediatamente seu saída. Aqui estão alguns exemplos de seu uso:

printf %s\n 'these are some words' \
    'that will each appear' \
    'on their own line' | 
    sed 's/.*words/echo & ; cat file/e'
these are some words
these
are
some
more
words    
that
are
stored
in
a
file
that will each appear
on their own line

E aqui está como você pode usar isso:

printf %s\n 'these are some words' \
    'that will each appear' \
    'on their own line' | 
sed 's/\(.*\)\n*words/\n&/;//P;s//\ncat file/ep;s/.*\n//'
these are some 
these
are
some
more
words
that
are
stored
in
a
file
that will each appear
on their own line
    
por 27.08.2014 / 08:31