Comment remplacer plusieurs espaces par un seul onglet

27

J'ai des fichiers texte qui contiennent des colonnes séparées par un certain nombre d'espaces, mais à la place, j'ai besoin d'un seul onglet comme séparateur. Est-il possible de faire à Bash?

Utilisateur inconnu
la source
Merci pour la grande entrée, mais j'ai quelques espaces simples à l'intérieur d'une colonne, donc je dois éviter de tabuler un seul espace. désolé pour ça, c'est de l'information.
user_unknown

Réponses:

31

Pour convertir des séquences de plusieurs espaces en onglet, mais laissez les espaces individuels seuls :

sed 's/ \+ /\t/g' inputfile > outputfile

Pour ce faire, pour un certain nombre de fichiers:

for inputfile in *
do
    sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done

ou

for inputfile in *
do
    sed -i.bak 's/ \+ /\t/g' "$inputfile"
done

ou

find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;
En pause jusqu'à nouvel ordre.
la source
sed: -e expression #1, char 1: unknown command: `.'
Aaron Franke
@AaronFranke: Quelle commande avez-vous essayée? Aucun des exemples de ma réponse ne devrait produire cette erreur.
pause jusqu'à nouvel ordre.
Désolé, j'aurais dû clarifier. Celui finddu bas.
Aaron Franke
@AaronFranke: GNU sedn'aime pas avoir d'espace avant l'extension de sauvegarde. J'ai édité ma réponse. Merci pour le rapport.
pause jusqu'à nouvel ordre.
7

Si votre personnage comporte plusieurs onglets, vous pouvez également utiliser tr -s:

-s, --squeeze-repeats   replace each input sequence of a repeated character
                        that is listed in SET1 with a single occurrence

Par exemple:

my_file.txt | tr -s " "

Tous les espaces blancs deviendront un.

user597119
la source
Ce n'est pas ce que demande OP.
RonJohn
5

Vous pouvez utiliser sedpour remplacer un certain nombre d'espaces par une tabulation:

Exemple pour remplacer un ou plusieurs espaces par un onglet:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file
IvanGoneKrazy
la source
L'OP a déclaré que le nombre d'espaces était variable , donc je ne pense pas que cette solution fonctionnera.
Mikel
@Mikel. Oops. Merci d'avoir fait remarquer cela. J'ai édité le post pour permettre la correspondance des espaces variables.
IvanGoneKrazy
Réponse la plus utile ici.
Luís de Sousa
3

La réponse la plus simple à utiliser uniquement bashest:

while read -r col1 col2 col3 ...; do
    echo -e "$col1\t$col2\t$col3..."
done <file

S'il y a un nombre variable de colonnes, vous pouvez le faire, mais cela ne fonctionnera que dans bash, pas sh:

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <file

par exemple

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <<EOF
a b   c
d   e    f
  g h i
EOF

produit:

a   b   c
d   e   f
g   h   i

(il y a un onglet entre chacun, mais il est difficile de voir quand je le colle ici)

Vous pouvez également le faire en utilisant sedou tr, mais notez que la gestion des blancs au début produit des résultats différents.

sed:

$ sed 's/  */\t/g' << EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

tr:

$ tr -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i
Mikel
la source
2

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

RedGrittyBrick
la source
2

Essayez le script SED suivant:

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

Où <TAB> appuie sur la touche TAB.

mdpc
la source
0

Ceci est une solution très simple:

    sed -E 's/\s+/\t/g' your_file > new_file

sed fonctionne essentiellement de cette manière (sed's / old_pattern / new_pattern / g '). Dans ce cas, l'ancien modèle est "\ s +", ce qui signifie trouver un espace "s" une ou plusieurs fois "+" et la barre oblique inverse "\" pour interpréter cela comme une expression régulière.
Le nouveau modèle est l'onglet "\ t" qui est écrit au format d'expression régulière et le "g" est d'appliquer le remplacement à toutes les lignes "globalement".

Waleed Omer
la source
1
Bonjour et bienvenue au superutilisateur. Vous devriez prendre le temps d'expliquer votre solution. Pour quelqu'un qui n'est pas familier avec les systèmes * nix, sed et les expressions régulières, cela ressemble à une pile de caractères étranges.
Mogget