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 > 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' {} \;
sed: -e expression #1, char 1: unknown command: `.'
find
du bas.
sed
n'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 occurrence
Par exemple:
my_file.txt | tr -s " "
Tous les espaces blancs deviendront un.
Vous pouvez utiliser sed
pour 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
La réponse la plus simple à utiliser uniquement bash
est:
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 sed
ou 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
perl -p -i -e 's/\s+/\t/g' *.txt
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".