Excluir vírgulas à direita na linha


10

Como excluo um conjunto de vírgulas à direita no bash:

a,b,c,d,,,,
1,2,3,,,,

Saída desejada:

a,b,c,d
1,2,3

Tentei fazer isso:

 grep "5628" test.csv | sed 's/,*$//g'

mas não funciona. O arquivo veio originalmente de uma máquina Windows.


2
Tem certeza de que não funcionou? Que comando completo você executou?
cuonglm

Positivo. Isso não aconteceu.
User2980702

Você pode fornecer seu comando exata, por favor (o sedque você mostrou, sem um nome de arquivo funciona como um filtro e não processa um arquivo no lugar )
roaima

grep "5628" test.csv | sed 's /, * $ // g'
user2980702

2
Se você precisar usar o arquivo no * nix e não conseguir copiá-lo novamente para o Windows, poderá ser mais fácil, a longo prazo, converter as terminações de linha de CR / LF para NL com dos2unixalgo assim .
G-Man diz 'Restabelecer Monica

Respostas:


13

Re o comando que você forneceu:

grep "5628" test.csv | sed 's/,*$//g'

Isso produzirá linhas correspondentes a '5628' com todas as vírgulas à direita removidas. Não atualizará o arquivo test.csv.

No entanto, você indicou que o arquivo veio de uma máquina Windows, portanto, as terminações de linha são CR / NL em vez de apenas NL. O resultado é que há um CR oculto no final da linha e você precisa de uma linha de comando:

grep "5628" test.csv | sed 's/,*\r*$//'

Na verdade, você pode simplesmente fazer isso em um comando:

sed -n '/5628/s/,*\r*$//p' test.csv

Não estou tentando fazer a atualização no local. Só preciso da saída sem vírgulas
user2980702

Isso funcionou Muito obrigado. Portanto, estamos procurando várias vírgulas (, *) antes do retorno de carro no final do arquivo (\ r * $). Estou certo ?
user2980702

Ele \r*permite zero ou mais caracteres CR (portanto continuará funcionando com arquivos derivados do Unix / Linux). Eu preferiria usar \r?para indicar um único CR opcional, mas não conseguia me lembrar da bandeira sedpara dizer para usar EREs no topo da minha cabeça. Eu acho que não é -rtestado aqui. O ,*é seu e corresponde a zero ou mais vírgulas.
roaima 3/08

o gnão é necessário, neste caso, ter apenas 1 final especificado pelo$
NeronLeVelu

2
sed -n '/5628/ s/,*\r*$//p' test.csv

(não o OP que pede apenas para remover o coma à direita), isso evita um processo de tubulação, pois leva diretamente o filtro e a conversão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.