Cela devrait être vraiment simple, mais pour une raison quelconque, cela ne fonctionne pas:
sed -i.bak -E 's/\t/ /' file.txt
Au lieu de remplacer les caractères de tabulation, il remplace les t
caractères. J'ai essayé toutes les variantes de ce que je pouvais penser, jouer avec citation, etc. J'ai googlé et trouvé tout le monde en utilisant des expressions assez similaires et ils semblent travailler pour eux.
Le -E
est une chose d'OS X. Je pensais que l'échec pouvait être le résultat d'une bizarrerie bizarre d'OS X sed
, alors je l'ai essayé aussi avec Ruby (sans le -i
) et j'ai obtenu le même résultat:
ruby -pe '$_.gsub!(/\t/," ")' < file.txt > file.new
J'utilise Bash 3.2.51 sur OS X et iTerm, bien que je ne vois pas en quoi ces applications pourraient être terriblement pertinentes. Je n'ai pas défini de variables d'environnement étranges, bien que je puisse en publier toutes celles que vous jugez pertinentes.
Quel pourrait être le problème?
Mise à jour : Je dois avoir fait une autre erreur oufautefrappe quand j'ai essayé la version Ruby, puisque Gilles souligne qu'il fait le travail (et jeai jamais lui avait me diriger mal!). Je ne suis pas sûr de ce qui s'est passé, mais je suis à peu près sûr que ce doit être mon erreur.
la source
\t
dans lased
déclaration parCTRL-V<TAB>
où se<TAB>
trouve la touche de tabulation et laCTRL-V
touche de contrôlev
enfoncée.Réponses:
La syntaxe
\t
d'un caractère de tabulation dans sed n'est pas standard. Cet échappement est une extension GNU sed . Vous trouvez beaucoup d'exemples en ligne qui l'utilisent parce que beaucoup de gens utilisent GNU sed (c'est l'implémentation de sed sur Linux non embarqué). Mais OS X sed , comme les autres * BSD sed, ne prend pas en charge les\t
tabulations et considère plutôt\t
comme une barre oblique inverse suivie det
.Il existe de nombreuses solutions, telles que:
Utilisez un caractère de tabulation littéral.
Utilisez
tr
ouprintf
pour produire un caractère de tabulation.Utilisez la syntaxe de chaîne de bash permettant les échappements avec barre oblique inversée .
Utilisez Perl, Python ou Ruby. L'extrait de Ruby que vous avez posté fonctionne.
la source
...sed
script (utilisé via l'-f
option), les caractères de tabulation littéraux me semblent la seule possibilité. Lors de l'édition avec vim,set noexpandtab
c'est important.tr
technique uniquement si vous voulez que votre collègue vous poignarde au visage quand il lit votre script.sed $'s/<regex>/\t/' file.txt
fonctionne pour l'insertion, mais cela$
semble rompre mon script lorsque j'essaie d'inclure une partie de l'expression rationnelle dans ma substitution, c'est-à-dire qu'ilsed $'s,\(ontology/[0-9]\+\),\t\txxx\1xxx\t\t,'
donne `xxxxxx` avec la valeur de correspondance attendue remplacée par ``. Y at-il un équivalent à\1
utiliser la syntaxe de chaîne de bash? Edit: il est supposé que le caractère unicode U + 231C se trouve au milieu du xxx <U + 231C> xxx.Utilisez une citation spécifique à Bash qui vous permet d'utiliser des chaînes comme en C, de sorte qu'un véritable caractère de tabulation soit passé à sed, et non une séquence d'échappement:
la source
fonctionne pour moi sur OS X et est la même commande que je utilise sur Linux tout le temps.
la source
Comme indiqué, toutes les
sed
implémentations ne prennent pas en charge la notation\t
sous forme d'onglet horizontal.Vous pouvez facilement réaliser votre substitution avec:
Ceci effectue un remplacement in situ qui conserve votre fichier d'origine en tant que "* .old". Perl autorise des délimiteurs alternatifs pour le classique,
/
rendant l'expression beaucoup plus lisible (c'est-à-dire dépourvue du syndrome du "cure-dent penché").Le
+
dit une ou plusieurs répétitions d'un caractère de tabulation doivent être remplacées. Leg
modificateur permet les remplacements globaux à la fin de chaque ligne.la source
Vous pouvez également utiliser à l'
echo
intérieursed
:sed -i "s/$(echo '\t')//g"
la source
echo '\t'
sortira\t
dans l'implémentation de certains shellsecho
.Si vous voulez un logiciel plus puissant
sed
(supportant\t
et plus) que celui sur OS X, installez GNU sed .la source
sed
le problème est celui d’OS X. Avez-vous une raison de croire que c'est le problème? Je serais ravi d’installer GNU sed si j’avais des raisons de penser que cela résoudrait le problème, mais il semble que j’ai à peu près exclu cela.ruby -pe '$_.gsub!(/\t/," ")' < file.txt
S'il est correct d'exiger
bash
ou enzsh
tant que shell, c'est la solution la plus simple à laquelle je puisse penser:Notez cependant que les
echo
drapeaux (-n
et-e
) ne sont pas définis dans POSIX, aussi un shell conforme à POSIX ne nécessite-t-il pas de comprendre ces drapeaux, mais beaucoup le feront pour des raisons de compatibilité.la source
Je suis surpris que personne n'ait suggéré la solution très simple de:
sed -i.bak -E 's/\\\t/ /' file.txt
Cela devrait faire l'affaire.Vous devez échapper à l'échappement (d'où les 3 \ s) pour permettre à sed de comprendre que vous essayez d'utiliser un caractère \ t dans l'expression régulière lorsque tout est substitué ...
la source
sed
, un seul\
suffit car aucune évasion n'est nécessaire. Le problème est que BSDsed
ne prend pas en charge cette syntaxe pour les onglets.Cela a fonctionné pour moi.
sed -e '/ [\ t] / / g'
la source
sed
. Ce n'est pas ce que l'OP utilise.