Como substituir uma lista de strings por outra lista

Como substituir uma lista de strings por outra lista

Eu tenho um arquivo que contém (muitas) strings que gostaria de substituir, então pensei em usar um comando simples como:

sed 's/string1/string2/g' file1 > out  

No entanto, existem muitas strings para que isso seja repetido manualmente. Então fiz uma lista de todas as strings a serem substituídas, cada uma em uma linha, e chamei-a de arquivo A. Em seguida, fiz uma lista de todas as strings de substituição e chamei-a de arquivo B.

Existe uma maneira de fazer algo como:

sed 's/line i of file A/line i of file B/g' file1 > out

para cada linha do arquivo A?

Responder1

Seria mais fácil criar um arquivo com as strings de entrada e de substituição na mesma linha (assumindo que nem as strings de entrada nem de substituição contenham espaços). Então você pode fazer algo simples como:

while read n k; do sed -i "s/$n/$k/g" file1; done < fileA

EDITAR:

Depois de ver a resposta de Nykakin, percebi que você pode fazer a mesma coisa com os dois arquivos combinando a sugestão dele com a minha:

paste fileA fileB | while read n k; do sed -i "s/$n/$k/g" file1; done 

Responder2

Esta é basicamente a sua primeira ideia, mas com os comandos de substituição colocados em um arquivo, eles são mais gerenciáveis:

tmpfile=/tmp/Asasuser.$$
exec 3< arquivoA
exec 4< arquivoB
enquanto lê –r astring <&3
fazer
        leia –r bstring <&4
        echo "s/$astring/$bstring/" >> "$tmpfile"
feito
executivo 3<&- 4<&-
sed –f "$tmpfile" arquivo1 > saída
rm –f "$tmpfile"

Isso pressupõe que fileAe fileBtenham o mesmo número de linhas (e que esse número seja maior que zero) e que nenhum deles tenha /caracteres sem escape.

Responder3

Podemos apenas gerar o comando que precisamos. Digamos que os arquivos com listas sejam chamados de lista e listb. Então podemos usar:

$ for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done

para gerar opção para sed. Agora podemos usá-lo com eval. Digamos que nosso arquivo se chame teste. Nós usamos:

$ eval "sed" $(for i in $(paste lista listb -d/); do echo -n "-e 's/$i/g' "; done) "test"

Responder4

paste -d : fileA fileB | sed 's/\([^:]*\):\([^:]*\)/s%\1%\2%/' > sed.script
sed -f  sed.script SOURCE-FILE

SOURCE-FILEpode ser um arquivo individual ou vários arquivos. O texto em arquivoA e arquivoB não pode conter caracteres de dois pontos ou de porcentagem, mas pode conter caracteres em branco.

informação relacionada