Cet article fait partie de la série en cours Unix Sed Tips and Tricks.
Dans nos articles précédents sur sed, nous avons appris l'impression sed, la suppression sed, la substitution sed, l'écriture de fichiers sed et les commandes multiples sed.
Dans cet article, passons en revue quelques solutions de contournement intéressantes avec la commande de remplacement "s" dans sed avec plusieurs exemples pratiques.
Je. Délimiteur de substitution Sed
Comme nous en avons discuté dans notre article précédent, nous pouvons utiliser les différents délimiteurs tels que @ % |; :dans la commande de substitution sed.
Commençons par créer le fichier path.txt qui sera utilisé dans tous les exemples mentionnés ci-dessous.
$ cat path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Exemple 1 – délimiteur sed @ :remplacez /opt/omni/lbin par /opt/tools/bin
Lorsque vous substituez un nom de chemin qui a '/', vous pouvez utiliser @ comme délimiteur au lieu de '/'. Dans l'exemple sed ci-dessous, dans la dernière ligne du fichier d'entrée, /opt/omni/lbin a été remplacé par /opt/tools/bin.
$ sed 's@/opt/omni/lbin@/opt/tools/bin@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
Exemple 2 – sed / délimiteur :remplacez /opt/omni/lbin par /opt/tools/bin
Lorsque vous devez utiliser '/' dans la substitution liée au nom de chemin, vous devez échapper '/' dans les données de substitution, comme indiqué ci-dessous. Dans cet exemple sed, le délimiteur "/" a été échappé dans la partie REGEXP et REPLACEMENT.
$ sed 's/\/opt\/omni\/lbin/\/opt\/tools\/bin/g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin: /opt/tools/bin:/opt/omni/sbin:/root/bin
II. Sed '&' Obtenir la chaîne correspondante
La partie précise d'une ligne d'entrée sur laquelle l'expression régulière correspond est représentée par &, qui peut ensuite être utilisée dans la partie de remplacement.
Exemple 1 – sed &Utilisation :remplacez /usr/bin/ par /usr/bin/local
$ sed 's@/usr/bin@&/local@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin/local:/usr/sas/bin /usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin/local:/opt/omni/bin: /opt/omni/lbin:/opt/omni/sbin:/root/bin
Dans l'exemple ci-dessus, "&" dans la pièce de rechange sera remplacé par /usr/bin qui correspond au modèle et l'ajoutera avec /local. Ainsi, dans la sortie, toutes les occurrences de /usr/bin seront remplacées par /usr/bin/local
Exemple 2 – sed &Usage :Correspond à toute la ligne
&remplace tout ce qui correspond à la REGEXP donnée.
$ sed 's@^.*$@<<<&>>>@g' path.txt <<</usr/kbos/bin:/usr/local/bin:/usr/jbin/:/usr/bin:/usr/sas/bin>>> <<</usr/local/sbin:/sbin:/bin/:/usr/sbin:/usr/bin:/opt/omni/bin:>>> <<</opt/omni/lbin:/opt/omni/sbin:/root/bin>>>
Dans l'exemple ci-dessus, regexp a "^.*$" qui correspond à toute la ligne. La pièce de remplacement <<<&>>> écrit la ligne entière avec <<
III. Regroupement et références arrière dans Sed
Le regroupement peut être utilisé dans sed comme une expression régulière normale. Un groupe s'ouvre avec "\(" et se ferme avec "\)". Le regroupement peut être utilisé en combinaison avec le référencement arrière.
La rétro-référence est la réutilisation d'une partie d'une Expression Régulière sélectionnée par regroupement. Les références arrière dans sed peuvent être utilisées à la fois dans une expression régulière et dans la partie de remplacement de la commande de substitution.
Exemple 1 :Obtenir uniquement le premier chemin de chaque ligne
$ sed 's/\(\/[^:]*\).*/\1/g' path.txt /usr/kbos/bin /usr/local/sbin /opt/omni/lbin
Dans l'exemple ci-dessus, \(\/[^:]*\) correspond au chemin disponible avant le premier :arrive. \1 remplace le premier groupe correspondant.
Exemple 2 :Multigroupement
Dans le fichier path.txt changez l'ordre des champs dans la dernière ligne du fichier.
$ sed '$s@\([^:]*\):\([^:]*\):\([^:]*\)@\3:\2:\1@g' path.txt /usr/kbos/bin:/usr/local/bin:/usr/jbin:/usr/bin:/usr/sas/bin /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/omni/bin: /root/bin:/opt/omni/sbin:/opt/omni/lbin
Dans la commande ci-dessus, $ spécifie que la substitution ne doit se produire que pour la dernière ligne. La sortie montre que l'ordre des valeurs de chemin dans la dernière ligne a été inversé.
Exemple 3 :Obtenir la liste des noms d'utilisateur dans le fichier /etc/passwd
Cet exemple sed affiche uniquement le premier champ du fichier /etc/passwd.
$sed 's/\([^:]*\).*/\1/' /etc/passwd root bin daemon adm lp sync shutdown
Exemple 4 :Entre parenthèses le premier caractère de chaque mot
Cet exemple sed imprime le premier caractère de chaque mot entre parenthèses.
$ echo "Welcome To The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g' (W)elcome (T)o (T)he (G)eek (S)tuff
Exemple 5 :Commifiez le nombre simple.
Créons un fichier appelé numéros contenant une liste de numéros. L'exemple de commande sed ci-dessous est utilisé pour valider les nombres jusqu'à des milliers.
$ cat numbers 1234 12121 3434 123 $sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers 1,234 12,121 3,434 123