Sommaire

Introduction

sed est une commande incontournable pour qui veut faire de la substitution de chaînes en utilisant les regexp.

Quelques options

  • -i modifie le fichier traité, il écrase donc le contenu qu’il avait avant l’opération de substitution
  • -r permet l’utilisation des regexp étendues
  • -e exécute l’expression, on peut utiliser plusieurs fois cette option de façon à exécuter plusieurs expressions à la suite

les modificateurs

Dans une expression on peut à la fin ajouter des modificateurs

sed -r -e 's/o/AA/gi'
                  \_/
                   |
              modificateurs
  • g l’opération est faite “globalement” c’est à dire qu’il essaie de substituer autant que possible, si cette option n’est pas présente, une seule substitution est effectuée par ligne
  • i sed ignore la casse, dans notre exemple o et O seront remplacés par AA

Le séparateur

Il est possible que pour des raisons pratiques le séparateur par défaut / soit problématique et qu’il faille l’échapper très souvent (un chemin d’un fichier par exemple), il est possible de le modifier.

exemple :

echo "/usr/share/oldpath" | sed -r -e 's/\/usr\/share\/oldpath/\/usr\/share\/newpath/g'
/usr/share/newpath

echo "/usr/share/oldpath" | sed -r -e 's#/usr/share/oldpath#/usr/share/newpath#g'
/usr/share/newpath

Utilisation des groupes matchés dans la chaîne de substitution

Exemple :

                             +-+-- références aux groupes \1 et \2
                             v v
sed -r -e 's/(192\.)(168\.)/\2\1/g' <<<"192.168.2.34"
              \___/  \___/  \/\/
                v      v    ^  ^
                |      |    |  |
                |      +----+  |
                |   groupe 2   |
                +--------------+
             groupe 1
168.192.2.34

Exemples

Reprenons notre fichier to_match

192.168.56.12
1.19.199.255
256.256.256.256
192.168.249.239
192.168.249.0
192.168.12.13/22
192.168.2.3/1
192.168.1.1/32
0.0.0.0
255.255.255.255
1924168156212
coucou
email@example.com
longtextesurunelignesansespace
1234569987762662665255252
12
code erreur #4.4.2
INPUT=12
OUTPUT=12
00.12.00.3

Substitution d’une chaîne par une autre

sed -r 's/192\.168\./10.10./g' to_match
10.10.56.12
1.19.199.255
256.256.256.256
10.10.249.239
10.10.249.0
10.10.12.13/22
10.10.2.3/1
10.10.1.1/32
0.0.0.0
255.255.255.255
1924168156212
coucou
email@example.com
longtextesurunelignesansespace
1234569987762662665255252
12
code erreur #4.4.2
INPUT=12
OUTPUT=12
00.12.00.3

J’effectue deux substitutions

sed -r -e 's/192\.168\./10.10./g' -e 's/#4\.4\.2/COUCOU/g' to_match 
10.10.56.12
1.19.199.255
256.256.256.256
10.10.249.239
10.10.249.0
10.10.12.13/22
10.10.2.3/1
10.10.1.1/32
0.0.0.0
255.255.255.255
1924168156212
coucou
email@example.com
longtextesurunelignesansespace
1234569987762662665255252
12
code erreur COUCOU
INPUT=12
OUTPUT=12
00.12.00.3

Attention lors de multiples substitutions la chaîne passe d’expression en expression en étant modifiée tour à tour.

echo "ABCD" | sed -r -e 's/A/Z/' -e 's/Z/W/'
WBCD

cela équivaut à

echo "ABCD" | sed -r -e 's/A/Z/' | sed -r -e 's/Z/W/'
WBCD

Gestion de la casse

sed -r -e 's/O/AAAAAAAAA/gi'  to_match.txt
10.10.56.12
1.19.199.255
256.256.256.256
10.10.249.239
10.10.249.0
10.10.12.13/22
10.10.2.3/1
10.10.1.1/32
0.0.0.0
255.255.255.255
1924168156212
cAAAAAAAAAucAAAAAAAAAu
email@example.cAAAAAAAAAm
lAAAAAAAAAngtextesurunelignesansespace
1234569987762662665255252
12
cAAAAAAAAAde erreur #4.4.2
INPUT=12
AAAAAAAAAUTPUT=12
00.12.00.3

sed -r -e 's/[Oo]/AAAAAAAAA/g'  to_match.txt
10.10.56.12
1.19.199.255
256.256.256.256
10.10.249.239
10.10.249.0
10.10.12.13/22
10.10.2.3/1
10.10.1.1/32
0.0.0.0
255.255.255.255
1924168156212
cAAAAAAAAAucAAAAAAAAAu
email@example.cAAAAAAAAAm
lAAAAAAAAAngtextesurunelignesansespace
1234569987762662665255252
12
cAAAAAAAAAde erreur #4.4.2
INPUT=12
AAAAAAAAAUTPUT=12
00.12.00.3

Utilisation des groupes

sed -r -e 's/(192\.)(168\.)/\2\1/g'  to_match
168.192.56.12
1.19.199.255
256.256.256.256
168.192.249.239
168.192.249.0
168.192.12.13/22
168.192.2.3/1
168.192.1.1/32
0.0.0.0
255.255.255.255
1924168156212
coucou
email@example.com
longtextesurunelignesansespace
1234569987762662665255252
12
code erreur #4.4.2
INPUT=12
OUTPUT=12
00.12.00.3

Message d’erreur lorsqu’on fait référence à un groupe qui n’existe pas

sed -r -e 's/(192\.)(168\.)/\2\1\3/g' to_match
sed: -e expression #1, char 25: invalid reference \3 on `s' command's RHS

Remplacement du dernier octet d’une IPV4 par un nombre aléatoire compris entre 0 et 255

sed -r -e 's/(((1[0-9][0-9]|[1-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3})(1[0-9][0-9]|[1-9]?[0-9]|2([0-4][0-9]|5[0-5]))/\1'$(($RANDOM % 256))'/g' to_match
192.168.56.1
1.19.199.1
256.256.256.256
192.168.249.1
192.168.249.1
192.168.12.1/22
192.168.2.1/1
192.168.1.1/32
0.0.0.1
255.255.255.1
1924168156212
coucou
email@example.com
longtextesurunelignesansespace
1234569987762662665255252
12
code erreur #4.4.2
INPUT=12
OUTPUT=12
00.12.00.3

## Le nombre aléatoire était 1 

Une seule substitution par ligne (pas de modificateur g)

sed -r -e 's/0\./AAA./' to_match
192.168.56.12
1.19.199.255
256.256.256.256
192.168.249.239
192.168.249.0
192.168.12.13/22
192.168.2.3/1
192.168.1.1/32
AAA.0.0.0
255.255.255.255
1924168156212
coucou
email@example.com
longtextesurunelignesansespace
1234569987762662665255252
12
code erreur #4.4.2
INPUT=12
OUTPUT=12
0AAA.12.00.3