Substituindo barras invertidas por vírgulas no Bash

3

Eu tentei escrever um script no qual estou lendo um arquivo linha por linha. Eu devo substituir uma barra invertida (\) por uma vírgula (,).

O arquivo de entrada é o seguinte:

1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5

A parte do código que escrevi é a seguinte:

#!/bin/bash

cat $1 | while read -r line
do
ln=$(echo $line | xargs | sed 's/\/,/g' )
echo $ln
done

echo Done!

Quando executo ./script.sh file.csv , estou recebendo a seguinte saída:

1,2,3,WORKSTATION1A,5
1,2,3,WORKSTATION2B,5
1,2,3,WORKSTATION1C,5
1,2,3,WORKSTATION1D,5
1,2,3,WORKSTATION1E,5
1,2,3,WORKSTATION1F,5
1,2,3,WORKSTATION1G,5
Done!

Considerando que estou esperando uma saída da seguinte forma:

1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
Done!

Eu também tentei substituir sed 's/\/,/g' por tr "\" "," , mas isso não está ajudando. Quaisquer modificações necessárias?

    
por Mandar Shinde 22.04.2014 / 05:46

5 respostas

8

Você já tentou isso

# cat a.txt 
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5

# sed -e 's/\/,/g' a.txt 

1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
    
por 22.04.2014 / 05:54
5

Aqui está uma maneira melhor de escrever o mesmo script que você tentou:

#!/bin/bash

while read -r line
do
  echo "$line" | sed 's/\/,/g'
done < "$1"

echo Done!

Claro, tudo poderia ser simplificado para

#!/bin/bash

tr '\' , < "$1"    
    
por 22.04.2014 / 14:26
3

Apenas certifique-se de que seu shell não coma essas barras invertidas quando for pressionado para sed :

sed 's/\/,/g' <<\BS
1,2,3,WORKSTATION1\A,5
1,2,3,WORKSTATION2\B,5
1,2,3,WORKSTATION1\C,5
1,2,3,WORKSTATION1\D,5
1,2,3,WORKSTATION1\E,5
1,2,3,WORKSTATION1\F,5
1,2,3,WORKSTATION1\G,5
BS

#OUTPUT#

1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
    
por 22.04.2014 / 05:56
3

Você poderia fazer isso nativamente no bash - usando ${line/\/,} para substituir a primeira ocorrência ou ${line//\/,} para substituir todas as ocorrências de \ em ${line} (equivalente a sed com o modificador -g ) :

while read -r line; do 
   echo "${line//\/,}"
done < file.csv
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
    
por 22.04.2014 / 17:54
2

Aqui vem uma solução awk,

$ awk -F'\' '{print $1","$2}' file.txt
1,2,3,WORKSTATION1,A,5
1,2,3,WORKSTATION2,B,5
1,2,3,WORKSTATION1,C,5
1,2,3,WORKSTATION1,D,5
1,2,3,WORKSTATION1,E,5
1,2,3,WORKSTATION1,F,5
1,2,3,WORKSTATION1,G,5
    
por 22.04.2014 / 17:07