J'utilise à la fois Linux et FreeBSD (en particulier, j'utilise Debian Linux et PC-BSD), et j'ai trouvé quelque chose de bizarre sed
.
J'ai souvent besoin de convertir des fichiers de "valeurs séparées par des tabulations" en "valeurs séparées par des virgules". La façon la plus simple que je connaisse est d'utiliser sed
, comme ceci:
sed 's/\t/,/g' inputFile.txt > outputFile.csv
Cela fonctionne parfaitement sous Linux: il remplace chaque onglet par une virgule ... mais sur FreeBSD, il ne remplace rien !!!
Suis-je en train de manquer quelque chose? Existe-t-il une syntaxe avec FreeBSD sed
différente de celle sous Linux?
-E
option fait l'affaire (à la fois sur FreeBSD et sur Mac OS X).Oui, il y a différentes différences, le comportement d'
-i
être le seul que je connaisse du haut de ma tête.Je n'ai jamais utilisé BSD, je ne peux donc pas vraiment aider avec les détails, mais une solution de contournement pourrait être d'utiliser à la
tr
place:Un effet secondaire agréable est que cela
tr
devrait être beaucoup plus rapide. J'ai testé cela sur mon Linux en utilisant un fichier de test avec 50000 lignes, chacune ayant 2 onglets:la source
tr '\t' ,
est plus portable quetr $'\t' ,
.tr '[\t]' '[,]'
serait même portable sur certains anciens systèmes SysV.cut
. La spécification POSIX pourtr
est là . J'avais tort sur le[
besoin de l'ancien SysV. Comme le souligne cette spécification POSIX, elle[
n'est nécessaire que pour les plages.Oui, contrairement à GNU
sed
FreeBSDsed
n'interprète pas les séquences d'échappement ANSI C comme\t
dans les expressions régulières.Dans ce cas, une façon d'obtenir un dénomiateur le moins courant est d'utiliser
printf
.Le comportement des
sed -i
modifications de fichiers sur place peut être rendu compatible si un commutateur ou une option suit immédiatement le-i
commutateur, par exemplesed -i -e 's/x/X/g' file
fonctionne à la fois pour GNUsed
et FreeBSDsed
.Les versions récentes de FreeBSD
sed
(FreeBSD 8.1 ou plus récent) ont le-r
commutateur pour augmenter la compatibilité avec GNUsed
.(De plus, l'utilisation des classes de caractères POSIX dans
sed
les expressions régulières est également un bon moyen de garantir la compatibilité).Pour une autre
sed
implémentation conforme à POSIX, voir: minised - une implémentation SED plus petite, moins chère et plus rapide .la source
Vous devez utiliser un TABcaractère littéral au lieu de
\t
:Voir ce commentaire de Stéphane sur une autre question.
L'article suivant peut également vous intéresser:
Je cite la partie pertinente:
la source
Après la connexion, je vois l'annonce suivante et l'enregistre. J'espère que cela sera utile pour les autres aussi
la source
-i
option était déjà couvert , mais