7
votes

Convertir le fichier TXT avec des espaces mixtes / des onglets sur des onglets uniquement (dans la mesure du possible)

J'ai un fichier de code source qui a des onglets / espaces mixtes et je souhaite le convertir en un fichier dans lequel il a automatiquement remplacé tous les espaces d'indentation par des onglets pour une longueur d'espace de tabulation donnée (par exemple, onglet = 2 espaces).

Toute solution facile (avec des outils UNIX communs, MacOSX, BASH ou ZSH)? Quelques commandes SED Script ou Python ou donc?

merci, Albert


2 commentaires

Puis-je demander qui a mis le vole proche ici? Et pourquoi? Et pourquoi sans commentaire?


Désolé pour le vote rapproché, je pensais d'abord que cela appartiendrait à SuperUserSer.com, mais j'ai vu qu'il ne pouvait pas être fait sans programmation.


7 Réponses :


0
votes

Vous pouvez utiliser une expression régulière pour remplacer n espaces par un caractère d'onglet. Par exemple en Python: xxx


1 commentaires

Ce n'est pas si facile. Ceci par exemple, cela ne remplacerait pas seulement les espaces utilisés pour l'indentation mais aussi partout ailleurs (et cela ne devrait pas le faire).



0
votes

Deux choses,

  1. sed -i Votre ami - sed -i xxx.txt 's / ^ [] \ \ {2 \} / \ t / g'
  2. Vous ne pouvez pas faire une expression régulière pour multiplier le remplacement de l'onglet par la longueur de l'espace.

    Compte tenu de mon awk-fu n'est pas fort (et je ne sais pas si cela peut faire ce que # 2 ne peut pas), je vais écrire un script php pour calculer les espaces et les remplacer par des onglets.


1 commentaires

OK, cela ne remplacera au moins les espaces au début. Bien que cela ne le remplace pas plusieurs fois. Je vais probablement écrire un script python qui le fait pour moi.



0
votes
sed -r 's/ {2}/\t/g' file

1 commentaires

Ce n'est pas si facile. Ceci par exemple, cela ne remplacerait pas seulement les espaces utilisés pour l'indentation mais aussi partout ailleurs (et cela ne devrait pas le faire).



1
votes

Selon le langage source, vous pouvez essayer Indent GNU . Il peut faire un grand nombre de choses relatifs à l'indentation du code source, bien que cela puisse être plus complexe que nécessaire.

Par exemple, si je donne le programme suivant à Indent -Di0 xxx

il le remplacera par: xxx

ou, si vous avez besoin de quelque chose de stupide simple, il y a le Développer / Nonpand Commandes.


3 commentaires

indent ne fonctionne pas (c'est python - difficile, je recherche également une solution qui fonctionne aussi dans les autres cas). Développer / NonPand est trop simple (comme la plupart des autres solutions données ici). :)


Peut-être le script reindent.py à svn.python.org/projects /python/trunk/tools/scripts/reindent. py donnera une base à ce dont vous avez besoin alors?


Hey, ce reindent.py semble surtout comme ce que je voulais. :) Eh bien, je n'ai pas regardé de manière grande là-dessus, je ne suis pas sûr que si ce n'est que Python - seulement (ce qui m'aurait aidé maintenant mais n'aurait pas été la solution générale que je cherchais). Codé moi-même maintenant ...



0
votes

Voici une solution possible en Python: xxx


2 commentaires

OK, meilleure solution que les autres mais cela ne fonctionnera pas s'il y a déjà des espaces mixtes / des onglets. Sth. Comme "\ t \ t" devrait devenir "\ t" * 3 .


Est-ce que cela fonctionne si vous remplacez la regex avec "^ (| \ t) +" ? Je pense que je ne comprends pas exactement les exigences. EDIT: C'est Deux espaces dans la nouvelle regex, le marquillage de code en ligne effondra malheureusement les espaces.



5
votes

0 commentaires

0
votes

Ceci convertira des espaces principaux (même entrecoupés avec des onglets) en onglets. Spécifiez le nombre d'espaces à convertir en définissant la variable. Les espaces errants seront effondrés à rien. Les espaces et les onglets qui apparaissent après n'importe quel caractère autre que l'espace ou l'onglet ne seront pas touchés. xxx pré>

Exemple: p>

[tab][tab][tab][tab][tab]TEXT[space][space][space]


3 commentaires

Totalement illisible mais ressemble à ce que je cherchais. :) BTW., Ne devrait-il pas être ... [onglet] [espace] texte dans la sortie? Au moins c'est ce que je veux.


Je retiens tous les espaces errants. Que voudriez-vous (pour tstop = 2 ) [onglet] [espace] [onglet] ... texte à ressembler? Qu'en est-il de [onglet] [espace] [espace] texte ?


[t] [s] [t] texte devrait devenir [t] [t] text . [t] [S] [S] texte devrait devenir [t] [t] text . [t] [S] texte devrait rester identique.