web-dev-qa-db-fra.com

Remplacer les espaces par des onglets sous Linux

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

92
biznez

Utilisez le programme unxpand (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'').
161
DigitalRoss

Je pense que tu peux 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 proposée par Sam Bisbee

tr ' ' \\t < someFile > someFile
40
Jonathan

Utiliser Perl:

Perl -p -i -e 's/ /\t/g' file.txt
9
John Millikin

mieux tr commande:

tr [:blank:] \\t

Cela nettoiera la sortie de say, nzip -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
9
Tarkin

Téléchargez et exécutez le script suivant pour convertir de manière récursive des onglets programmables en onglets fixes dans des fichiers en texte brut.

Placez et exécutez le script à l'intérieur du dossier contenant les fichiers de texte brut.

#!/bin/bash

find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
    echo "Converting... "$file"";
    data=$(unexpand --first-only -t 4 "$file");
    rm "$file";
    echo "$data" > "$file";
}; done;
3
daka

Exemple de commande permettant de convertir chaque fichier .js du répertoire en cours en onglets (seuls les espaces de début sont convertis):

find . -name "*.js" -exec bash -c 'unexpand -t 4 --first-only "$0" > /tmp/totabbuff && mv /tmp/totabbuff "$0"' {} \;
2
arkod

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.`
1
abc

Cela remplacera les espaces consécutifs par un espace (mais pas de tabulation).

    tr -cs '[:space:]'
0
mel