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 fileA
e fileB
tenham 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-FILE
pode 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.