Commandes avancées de sed et correspondance de motifs
Maintenant que nous maîtrisons les substitutions de base et l'édition en place avec sed, explorons quelques fonctionnalités plus avancées :
- Utilisation de différents délimiteurs
- Utilisation de plages d'adresses pour cibler des lignes spécifiques
- Combinaison de plusieurs commandes
Utilisation de différents délimiteurs
Bien que nous ayons utilisé le slash / comme délimiteur dans nos commandes de substitution, sed nous permet d'utiliser n'importe quel caractère comme délimiteur. Cela est particulièrement utile lorsque le motif ou le texte de remplacement contient des slashes.
Créons un fichier avec des chemins de fichiers :
echo "/usr/local/bin is in the PATH" > ~/project/paths.txt
echo "My config is in /etc/myapp/config.json" >> ~/project/paths.txt
Si nous voulons remplacer /usr/local/bin par /opt/bin, utiliser des slashes serait confuse :
sed 's/\/usr\/local\/bin/\/opt\/bin/' ~/project/paths.txt
Au lieu de cela, nous pouvons utiliser un autre délimiteur, comme # :
sed 's#/usr/local/bin#/opt/bin#' ~/project/paths.txt
Cela est beaucoup plus lisible ! La sortie devrait être :
/opt/bin is in the PATH
My config is in /etc/myapp/config.json
D'autres délimiteurs courants incluent |, : et _.
Adressage - Ciblage de lignes spécifiques
sed nous permet de spécifier les lignes sur lesquelles appliquer la substitution. Cela se fait en préfixant la commande avec une adresse.
Créons un nouveau fichier avec des lignes numérotées :
echo "Line 1: This is the first line." > ~/project/numbered.txt
echo "Line 2: This is the second line." >> ~/project/numbered.txt
echo "Line 3: This is the third line." >> ~/project/numbered.txt
echo "Line 4: This is the fourth line." >> ~/project/numbered.txt
echo "Line 5: This is the fifth line." >> ~/project/numbered.txt
Pour remplacer "line" par "row" seulement sur la ligne 3 :
sed '3 s/line/row/' ~/project/numbered.txt
La sortie devrait être :
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth line.
Line 5: This is the fifth line.
Nous pouvons également spécifier une plage de lignes. Pour remplacer "line" par "row" sur les lignes 2 à 4 :
sed '2,4 s/line/row/' ~/project/numbered.txt
La sortie devrait être :
Line 1: This is the first line.
Line 2: This is the second row.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.
Une autre fonction utile est la capacité de correspondre aux lignes en fonction d'un motif. Par exemple, pour remplacer "line" par "row" seulement sur les lignes qui contiennent "third" ou "fourth" :
sed '/\(third\|fourth\)/ s/line/row/' ~/project/numbered.txt
La sortie devrait être :
Line 1: This is the first line.
Line 2: This is the second line.
Line 3: This is the third row.
Line 4: This is the fourth row.
Line 5: This is the fifth line.
Combinaison de plusieurs commandes
Nous pouvons combiner plusieurs commandes sed en utilisant l'option -e ou en séparant les commandes par des points-virgules.
Remplaçons "first" par "1st", "second" par "2nd" et "third" par "3rd" en une seule commande :
sed -e 's/first/1st/' -e 's/second/2nd/' -e 's/third/3rd/' ~/project/numbered.txt
Alternativement, nous pouvons utiliser des points-virgules :
sed 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt
Les deux commandes devraient produire la même sortie :
Line 1: This is the 1st line.
Line 2: This is the 2nd line.
Line 3: This is the 3rd line.
Line 4: This is the fourth line.
Line 5: This is the fifth line.
Rendons maintenant ces modifications permanentes :
sed -i 's/first/1st/; s/second/2nd/; s/third/3rd/' ~/project/numbered.txt
Et vérifions les modifications :
cat ~/project/numbered.txt
Vous devriez voir le texte mis à jour avec les numéros ordinaux.