Linux : utiliser des caractères spéciaux dans Bash

Supposons que j’ai un fichier qui contient :

Ligne1 aze
Ligne2 rty
Ligne3 ui
Ligne4 op

Note : il n’y a pas d’espace dans le fichier, uniquement des tabulations.

Comment faire pour afficher uniquement la deuxième colonne ? La commande cut serait parfaite mais il n’est pas possible de mettre une tabulation dans une ligne de commande Bash.

En fait c’est plutôt facile, Il est possible d’utiliser des séquences d’échappement grâce à l’ANSI-C Quoting (désolé, j’ai pas trouvé de traduction). Exemple :

$ cut -d $'\t' -f 2 fichier.txt
aze
rty
ui
op

La liste des séquences d’échappement est disponible ici : https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html

L’ANSI-C Quoting est disponible avec toutes les commandes Bash, et permets d’utiliser pas mal de commandes de manière « non standard ». Par exemple, pour affiche la troisième ligne d’un fichier :

$ cut -d $'\n' -f 3 fichier.txt
Ligne3 ui

Linux : changer le séparateur dans une boucle for

Admettons que j’ai un fichier qui contienne :

Linux, y’a moins bien mais c’est plus chère.
rm -fr en root, system dans la choucroute.

Faisons une boucle for basique dessus :

for i in `cat fichier.txt`
do
  echo $i
done

Le résultat ne correspond pas à ce à quoi on pourrait s’attendre :

Linux,
y’a
moins
bien
mais
c’est
plus
chère.
rm
-fr
en
root,
system
dans
la
choucroute.

La raison est simple, la boucle for prends comme séparateur les retours à la ligne, mais aussi les espaces, les tabulations et tous les autres caractères du style. Heureusement, la variable d’environnement $IFS (comme Internal Field Separator) permets de fournir sa propre liste de séparateurs. Il suffit de faire :

IFS=$'\n'
for i in `cat fichier.txt`
do
  echo $i
done

Le résultat correspond à ce qui est attendu :

Linux, y’a moins bien mais c’est plus chère.
rm -fr en root, system dans la choucroute.