20 Nov 2019, 00:00

Sed

Share

https://www.grymoire.com/Unix/Sed.html#uh-61

Substitution

Lorsqu’on encadre la regex avec des apostrophes, son contenu est envoyé littéralement à sed.
Lorsqu’on l’encadre avec des guillements, les variables sont déployées par bash avant passage à sed.

L’option -r sert à passer en syntaxe d’expression régulières étendues. La seule différence est que, en mode étendu, les caractères ?+(){} servent par défaut de caractères spéciaux, et qu’ils faut les échapper pour les considérer en caractères littéraux.
Source

Un groupe encadré par des parenthèses signifie “cette suite de caractères précisément”.
On peut également accéder à ce contenu dans la partie remplacement. Le contenu des premières parenthèses sera accessible par \1, le contenu des deuxièmes par \2 etc (backreferences)
Par exemple,
echo azerty | sed -r 's/a(ze)r(ty)/\1 \2/'
renverra ze ty.

Un groupe de caractères entre crochet signifie “un caractère parmi ceux-là”. Le point doit être échappé pour y être placé. Si on souhaite placer les crochets eux-même dans ce groupe, il semble qu’il faille les mettre en premier, crochet fermant d’abord. On peut aussi y placer [:space:] pour inclure les espaces et tabulations. De même, il semble qu’il faille les mettre juste après les crochets (inclus dans les crochets).
Par exemple :
sed 's/[][[:space:](){}\._-]//g'

On peut choisir le nombre d’occurences d’un motif grâce à plusieurs opérateurs:
* : 0 ou + occurences
? : 0 ou 1 occurence
+ : 1 et +
{m} : m occurences
{m,n} : entre m et n occurences
{m,} : m occurences et plus

Suppression de lignes

Se fait avec la syntaxe sed '/PATTERN/d' qui supprimera les lignes qui contiennent le motif “PATTERN”.
À l’inverse, sed '/PATTERN/!d' supprimera les lignes qui ne contiennent PAS le motif “PATTERN”. Dans ce cas, les simples apostrophes semblent nécessaires, sinon le motif “!d” est transformé en la commande “date”.