accueil > Traitement et recherche de texte > awk-gsub

awk-gsub : Substitution globale de chaînes

La fonction `gsub` utilisée dans la commande `awk` sert à remplacer globalement toutes les occurrences d'une chaîne correspondant à une expression régulière spécifique par une autre chaîne. Elle est très utile pour modifier en masse des motifs qui apparaissent plusieurs fois dans le contenu d'un fichier ou dans un flux.

Aperçu

`gsub` est l'abréviation de Global Substitution. C'est une fonction qui remplace toutes les parties d'un script `awk` correspondant à une expression régulière spécifiée par une chaîne donnée. Contrairement à la fonction `sub` qui ne remplace que la première correspondance, `gsub` remplace toutes les correspondances.

Syntaxe de la fonction gsub

gsub(expression_régulière, chaîne_de_remplacement, [chaîne_cible])

  • Expression régulière (regex): L'expression régulière qui définit le motif à rechercher.
  • Chaîne de remplacement (replacement): La chaîne qui remplacera le motif trouvé.
  • Chaîne cible (target_string): La chaîne sur laquelle l'opération de remplacement sera effectuée. Si elle est omise, elle s'applique à l'ensemble de l'enregistrement courant ($0).

Valeur de retour

La fonction `gsub` renvoie le nombre de remplacements effectués sous forme d'entier. Cette valeur de retour peut être utile dans des conditions, par exemple.

Exemples d'utilisation

Divers exemples de substitution de chaînes utilisant la fonction `gsub`.

Remplacer toutes les occurrences de 'old' par 'new' dans un fichier

echo 'This is an old file with old data.' > data.txt
awk '{gsub(/old/, "new"); print}' data.txt

Modifie toutes les occurrences du mot 'old' en 'new' dans le fichier data.txt. Affiche le contenu modifié.

Remplacer les espaces par des tirets

echo 'Hello World from Awk' | awk '{gsub(/ /, "-"); print}'

Remplace tous les espaces dans la chaîne d'entrée par des tirets (-).

Remplacer uniquement dans un champ spécifique

echo 'field1 field2 apple' | awk '{gsub(/a/, "X", $3); print}'

Remplace 'a' par 'X' uniquement dans le troisième champ ($3). (Exemple : 'apple banana cat' -> 'apple banana cXt')

Remplacer sans distinction de casse

echo 'Apple is an apple.' | awk 'BEGIN {IGNORECASE=1} {gsub(/apple/, "orange"); print}'

Définit la variable `IGNORECASE` à 1 pour remplacer 'apple' par 'orange' sans tenir compte de la casse.

Supprimer uniquement les chiffres

echo 'Product ID: 12345 ABC' | awk '{gsub(/[0-9]/, ""); print}'

Supprime tous les chiffres de la chaîne.

Conseils et points d'attention

Conseils utiles et points à considérer lors de l'utilisation de la fonction `gsub`.

Différence avec la fonction sub

`gsub` remplace toutes les correspondances, tandis que la fonction `sub` ne remplace que la première correspondance. Choisissez la fonction appropriée selon vos besoins.

  • `gsub(regex, replacement, target)` : Remplace toutes les correspondances
  • `sub(regex, replacement, target)` : Remplace uniquement la première correspondance

Caractères spéciaux dans les expressions régulières

Pour utiliser des caractères spéciaux tels que `.`, `*`, `+`, `?`, `[`, `]`, `(`, `)`, `|`, `^`, `$`, `\` littéralement dans une expression régulière, vous devez les échapper avec `\`. Par exemple, pour rechercher un point littéral (`.`), utilisez `\.`.

Attention en cas d'omission de la chaîne cible

Si la `chaîne_cible` est omise, le remplacement s'applique par défaut à l'ensemble de l'enregistrement courant ($0). Pour l'appliquer uniquement à un champ spécifique, vous devez impérativement spécifier le champ sous la forme `gsub(regex, replacement, $N)`.

Antislash dans la chaîne de remplacement

Dans la chaîne de remplacement, l'antislash (`\`) peut avoir une signification spéciale. Par exemple, `\&` représente la chaîne entière correspondante. Pour utiliser un antislash littéral, vous devez l'échapper deux fois, par exemple avec `\\`.


Commandes de la même catégorie