Eu tenho um arquivo CSV com tuplas de valores em que preciso alterar as ocorrências de uma para outra em um arquivo (grande) diferente.
Até agora, fiz uma linha de leitura [...] < foo.csv, essencialmente executando sed uma vez para cada linha no arquivo CSV.
Isso leva um pouco de tempo, então me perguntei se eu deveria mudar o loop while para construir uma string muito longa de várias instruções -e e então executá-la com eval.
Eu poderia tentar, obviamente, mas se alguém puder me dizer se o sed irá apenas, essencialmente, fazer o mesmo que eu fiz até agora, ou seja, executar o arquivo para cada instrução -e, significando que nenhum ganho de desempenho é ter, então eu não acho que vou me incomodar.
Editar após comentários:
Basicamente, eu faço o seguinte:
while read line
do
old_user=echo $line | cut -d \; -f 2|tr -d \"
new_user=echo $line | cut -d \; -f 4|tr -d \"
if [ "$old_user" != "$new_user" ]
then
sed -i -e "s/^(.*ri:username=\")$old_user(\".*)$/$new_user/g" confluence/entities_converted.xml
fi
done < usernames.csv
Se você perceber que é um arquivo XML, o motivo é que há várias instâncias em que a análise e a regravação de XML são incômodas, portanto, sed
. Pergunto-me se, em vez de executar sed
várias vezes, devo construir vários argumentos -e
para sed
.
usernames.csv
parece com
"Full name";"Username";"Email";"New username"
"Sune Mølgaard";"sune.molgaard";"[email protected]";"smo"
Pode haver qualquer número de linhas ao longo do caminho da segunda linha, daí o looping. Estou ciente de que a primeira linha provavelmente não será compatível, mas isso é insignificante.