GNU/Linux >> Tutoriels Linux >  >> Linux

Remplacement d'une sous-chaîne par une autre chaîne dans Bash

Voici le scénario. Vous avez une grosse chaîne et vous voulez en remplacer une partie par une autre chaîne.

Par exemple, vous souhaitez modifier "J'écris une ligne aujourd'hui " à "J'écris une ligne maintenant ".

Dans ce rapide tutoriel, je vais vous montrer comment remplacer une sous-chaîne nativement dans Bash. Je montrerai également l'exemple de commande sed en tant qu'extension.

Remplacer la sous-chaîne nativement dans bash (bon pour une seule ligne)

Bash a quelques méthodes intégrées pour la manipulation de chaînes. Si vous souhaitez remplacer une partie d'une chaîne par une autre, procédez comme suit :

${main_string/search_term/replace_term}

Créez une variable de chaîne composée de la ligne :"J'écris une ligne aujourd'hui" sans les guillemets, puis remplacez today avec now :

[email protected]:~$ line="I am writing a line today"
[email protected]:~$ echo "${line/today/now}"
I am writing a line now

Avez-vous compris ce qui vient de se passer ? Dans la syntaxe "${line/today/now}" , line est le nom de la variable où je viens de stocker la phrase entière. Ici, je lui demande de remplacer la première occurrence du mot today avec now . Ainsi, au lieu d'afficher le contenu de la variable d'origine, il vous a montré la ligne avec le mot modifié.

Par conséquent, la line la variable n'a pas vraiment changé. C'est toujours pareil :

[email protected]:~$ echo $line
I am writing a line today

Mais vous pouvez certainement remplacer le mot que vous voulez et modifier la même variable pour rendre les changements permanents :

[email protected]:~$ line="${line/today/now}"
[email protected]:~$ echo $line
I am writing a line now

Maintenant, les modifications ont été rendues permanentes et c'est ainsi que vous pouvez remplacer définitivement la première occurrence d'une sous-chaîne dans une chaîne.

Vous pouvez également utiliser d'autres variables pour stocker des sous-chaînes spécifiques que vous souhaitez remplacer :

[email protected]:~$ replace="now"
[email protected]:~$ replacewith="today"
[email protected]:~$ line="${line/${replace}/${replacewith}}"
[email protected]:~$ echo $line
I am writing a line today

Ici, j'ai stocké le mot à remplacer dans une variable appelée replace et le mot par lequel il serait remplacé à l'intérieur de replacewith . Après cela, j'ai utilisé la même méthode que celle décrite ci-dessus pour "réviser" la ligne. Maintenant, les modifications que j'avais apportées au début de ce didacticiel ont été annulées.

Prenons un autre exemple :

[email protected]:~$ hbday="Happy Birthday! Many Many Happy Returns!"
[email protected]:~$ hbday="${hbday/Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many Many Happy Returns!

Remplacer toutes les occurrences d'une sous-chaîne

Vous pouvez également remplacer plusieurs occurrences de sous-chaînes à l'intérieur de chaînes. Voyons cela à travers un autre exemple :

[email protected]:~$ hbday="${hbday//Many/So Many}"
[email protected]:~$ echo $hbday
Happy Birthday! So Many So Many Happy Returns!

Ce / supplémentaire après hbday l'a fait remplacer toutes les occurrences de Many avec So Many à l'intérieur de la phrase.

Remplacer la chaîne à l'aide de la commande sed (peut également fonctionner sur les fichiers)

Voici une autre façon de remplacer les sous-chaînes dans une chaîne en bash. Utilisez la commande sed de cette manière :

Remplacer la première occurrence :

line=$(sed "s/$replace/s//$replacewith/" <<< "$line")

Si je prends le premier exemple, il peut être joué comme :

Vous pouvez également remplacer toutes les occurrences en ajoutant g à la fin :

line=$(sed "s/$replace/$replacewith/g" <<< "$line")

Maintenant, vous pouvez penser que c'est plus compliqué que la méthode de chaîne bash native. Peut-être, mais sed est très puissant et vous pouvez l'utiliser pour remplacer toutes les occurrences d'une chaîne dans un fichier.

sed -i 's/$replace/$replacewith/' filename

Voici un exemple de certains des livres d'Agatha Christie dont le titre contient "Murder" :

[email protected]:~$ cat agatha.txt 
The Murder in the Vicarage
Murder in Mesopotamia
Murder is Easy
Murder on the Orient Express
Murder In Retrospect

Je vais remplacer Meurtre par Mariage parce que certaines personnes pensent que les deux sont identiques :

sed -i "s/Murder/Marriage/g" agatha.txt

Et voici maintenant le fichier modifié :

The Marriage in the Vicarage
Marriage in Mesopotamia
Marriage is Easy
Marriage on the Orient Express
Marriage In Retrospect

Sed est un outil très puissant pour éditer des fichiers texte sous Linux. Vous devriez au moins apprendre ses bases.

Avez-vous apprécié la lecture de cet article ? Si vous avez quelque chose à partager sur le remplacement des chaînes ou cet article, veuillez le faire dans les commentaires ci-dessous.


Linux
  1. Comment remplacer une chaîne par une chaîne contenant une barre oblique avec Sed ?

  2. Bash -c avec des paramètres positionnels ?

  3. Exemples de manipulation de chaînes Bash - Longueur, sous-chaîne, rechercher et remplacer

  4. Comment écrire une chaîne de plusieurs lignes en utilisant Bash avec des variables ?

  5. Remplacer un mot par un autre en bash

Remplacer du par de la poussière sous Linux

Chaînes de concaténation bash

Comment vérifier si une chaîne contient une sous-chaîne dans Bash

Remplacement de chaîne dans Bash

Script Bash - Manipulation de chaînes

Interfaces utilisateur avec dialogue. Script bash (IV)