Supprimer les virgules de fin en ligne


10

Comment supprimer un ensemble de virgules de fin dans bash:

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

Sortie désirée:

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

J'ai essayé de faire ceci:

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

mais ça ne marche pas. Le fichier provenait à l'origine d'une machine Windows.


2
Êtes-vous sûr que cela n'a pas fonctionné? Quelle commande complète avez-vous exécutée?
cuonglm du

Positif. Ce ne fut pas le cas.
user2980702

Pouvez-vous fournir votre commande exacte, s'il sedvous plaît (le que vous avez montré sans nom de fichier agit comme un filtre et ne traite pas un fichier en place )
roaima

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

2
Si vous devez utiliser le fichier dans * nix et que vous n'avez pas besoin de pouvoir le recopier vers Windows, il pourrait être plus facile à long terme de convertir les fins de ligne de CR / LF en NL avec dos2unixou quelque chose comme ça .
G-Man dit `` Réintègre Monica ''

Réponses:


13

Concernant la commande que vous avez fournie:

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

Cela produira des lignes correspondant à '5628' avec toutes les virgules de fin supprimées. Il ne mettra pas à jour le fichier test.csv.

Cependant, vous avez indiqué que le fichier provenait d'une machine Windows, donc les fins de ligne sont CR / NL au lieu de simplement NL. Le résultat est qu'il y a un CR caché à la fin de la ligne, et vous avez besoin d'une ligne de commande à la place:

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

En fait, vous pouvez simplement faire ceci avec une seule commande:

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

Je n'essaye pas de faire une mise à jour sur place. Juste besoin de la sortie sans virgule
user2980702

Cela a fonctionné Merci beaucoup. Nous recherchons donc plusieurs virgules (, *) avant le retour chariot à la fin du fichier (\ r * $). Ai-je raison ?
user2980702

Le \r*permet zéro ou plusieurs caractères CR (il continuera donc à fonctionner avec les fichiers dérivés Unix / Linux). Je préférerais utiliser \r?pour indiquer un seul CR facultatif mais je ne me souvenais pas du drapeau pour sedlui dire d'utiliser les ERE sur le dessus de ma tête. Je pense que ce n'est -rpas testé ici. Le ,*est le vôtre et correspond à zéro ou plusieurs virgules.
roaima

le gn'est pas nécessaire dans ce cas, ter est seulement 1 extrémité spécifiée par$
NeronLeVelu

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

(pas l'OP qui ne demande qu'à supprimer le coma de fuite) cela évite un processus de tuyauterie, sed prenant directement le filtre et la conversion

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.