117 votes

Remplacer les espaces blancs par des tabulations sous linux

Comment remplacer les espaces blancs par des tabulations sous linux dans un fichier texte donné ?

190voto

DigitalRoss Points 80400

Utilisez le programme unexpand(1)


UNEXPAND(1)                      User Commands                     UNEXPAND(1)

NAME
       unexpand - convert spaces to tabs

SYNOPSIS
       unexpand [OPTION]... [FILE]...

DESCRIPTION
       Convert  blanks in each FILE to tabs, writing to standard output.  With
       no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are  mandatory  for  short  options
       too.

       -a, --all
              convert all blanks, instead of just initial blanks

       --first-only
              convert only leading sequences of blanks (overrides -a)

       -t, --tabs=N
              have tabs N characters apart instead of 8 (enables -a)

       -t, --tabs=LIST
              use comma separated LIST of tab positions (enables -a)

       --help display this help and exit

       --version
              output version information and exit
. . .
STANDARDS
       The expand and unexpand utilities conform to IEEE Std 1003.1-2001
       (``POSIX.1'').

5 votes

Woah, je ne savais pas que expand/unexpand existait. J'essayais de faire le contraire et expand était parfait plutôt que d'avoir à déconner avec tr o sed .

4 votes

Pour mémoire, expand/unexpand sont services publics standard .

5 votes

C'est cool que ce soit standard. J'adore le Philosophie d'UNIX . Ce serait bien s'il pouvait se faire en place.

54voto

Jonathan Points 6611

Je pense que vous pouvez essayer avec awk

awk -v OFS="\t" '$1=$1' file1

ou SED si vous préférez

sed 's/[:blank:]+/,/g' thefile.txt > the_modified_copy.txt

ou même tr

tr -s '\t' < thefile.txt | tr '\t' ' ' > the_modified_copy.txt

ou une version simplifiée de la solution tr suggérée par Sam Bisbee.

tr ' ' \\t < someFile > someFile

4 votes

Dans votre exemple sed, les meilleures pratiques vous dictent d'utiliser tr pour remplacer les caractères uniques plutôt que sed pour des raisons d'efficacité et de rapidité. De plus, l'exemple tr est beaucoup plus simple de cette façon : tr ' ' \\t < someFile > someFile

2 votes

Bien sûr, tr est plus performant que sed, mais la principale raison pour laquelle j'aime Unix est qu'il existe de nombreuses façons de faire quelque chose. Si vous prévoyez de faire cette substitution plusieurs fois, vous chercherez une solution avec de bonnes performances, mais si vous ne le faites qu'une fois, vous chercherez une solution qui implique une commande qui vous met à l'aise.

2 votes

Arg. J'ai dû faire des essais et des erreurs pour faire fonctionner le sed. Je ne sais pas pourquoi j'ai dû échapper le signe plus comme ça : ls -l | sed "s/ \+/ /g"

15voto

John Millikin Points 86775

Utilisation de Perl :

perl -p -i -e 's/ /\t/g' file.txt

3 votes

J'ai eu un problème similaire en remplaçant des espaces consécutifs par une simple tabulation. Perl a fonctionné avec seulement l'ajout d'un '+' à la regexp.

0 votes

Mais, bien sûr, je voulais faire le contraire : convertir les tabulations en deux espaces : perl -p -i -e 's/\t/ /g' *.java

0 votes

Puis-je faire cela de manière récursive ?

12voto

Tarkin Points 33

Meilleur tr commandement :

tr [:blank:] \\t

Cela nettoiera la sortie de say, unzip -l pour un traitement ultérieur avec grep, cut, etc.

Par exemple,

unzip -l some-jars-and-textfiles.zip | tr [:blank:] \\t | cut -f 5 | grep jar

0 votes

Je n'ai pas besoin d'utiliser des guillemets pour que ça marche : tr [:blank:] \\t

1voto

abc Points 2888

Vous pouvez également utiliser astyle . Je l'ai trouvé très utile et il a aussi plusieurs options :

Tab and Bracket Options:
   If  no  indentation  option is set, the default option of 4 spaces will be used. Equivalent to -s4 --indent=spaces=4.  If no brackets option is set, the
   brackets will not be changed.

   --indent=spaces, --indent=spaces=#, -s, -s#
          Indent using # spaces per indent. Between 1 to 20.  Not specifying # will result in a default of 4 spaces per indent.

   --indent=tab, --indent=tab=#, -t, -t#
          Indent using tab characters, assuming that each tab is # spaces long.  Between 1 and 20. Not specifying # will result in a default assumption  of
          4 spaces per tab.`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X