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?
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?
Réponses:
Pour convertir des séquences de plusieurs espaces en onglet, mais laissez les espaces individuels seuls :
sed 's/ \+ /\t/g' inputfile > outputfilePour ce faire, pour un certain nombre de fichiers:
for inputfile in *
do
    sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
doneou
for inputfile in *
do
    sed -i.bak 's/ \+ /\t/g' "$inputfile"
doneou
find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;sed: -e expression #1, char 1: unknown command: `.'
                    finddu bas.
                    sedn'aime pas avoir d'espace avant l'extension de sauvegarde. J'ai édité ma réponse. Merci pour le rapport.
                    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 occurrencePar exemple:
my_file.txt | tr -s " "Tous les espaces blancs deviendront un.
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-fileLa réponse la plus simple à utiliser uniquement bashest:
while read -r col1 col2 col3 ...; do
    echo -e "$col1\t$col2\t$col3..."
done <fileS'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 <filepar exemple
while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <<EOF
a b   c
d   e    f
  g h i
EOFproduit:
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       itr:
$ tr -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       iperl -p -i -e 's/\s+/\t/g' *.txt
Ceci est une solution très simple:
    sed -E 's/\s+/\t/g' your_file > new_filesed 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".