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.