Sed

Révision de 15 mai 2016 à 21:22 par Qfouet (discussion | contributions) (Les variables)

Révision de 15 mai 2016 à 21:22 par Qfouet (discussion | contributions) (Les variables)

Sommaire

Généralité

Sed est ce que l'on appelle un éditeur de flux, il permet d'éditer n'importe quel fichier écrit (du code, des textes, bref tout ce qui peu s'ouvrir avec un pad) C'est un outil qui est comparable a Awk.

Sed se contrôle via un terminal !

sed -x ....

Aussi on peut synthétiser une liste d'action dans un fichier, que l'on exécute via le terminal.

Sed ne sait pas faire de calculs. Sed n'est pas simple à utiliser pour travailler sur plusieurs ligne en même temps.

Comment ça marche

Sed fonctionne par ligne, c'est à dire qu'il va effectuer une suite d'action sur une ligne puis passer à la ligne suivante.
Sa fonctionnalité première est d’effectuer des "Rechercher & Remplacer" complexes, ainsi que de créer des procédures réutilisable par la suite.

  • Il peut par exemple dans un texte remplacer tout les termes commençant par R et dont les 3 prochains caractères sont I, U, ou S.
  • On s'en sert à PlateformeC pour formater des fichier gcode rapidement.

C'est un outil puissant et pratique, néanmoins sa syntaxe est un peu difficile à cerner au tout début, aussi je vous encourage à regarder plusieurs tuto, sur internet en espérant que quelques uns vous parlerons mieux que d'autres.

Les Paramètres

Ici nous parlerons des fonctions soit des commandes "sed -x ..."

-e expression

C'est la principale fonction de sed, elle permet de lancer les commandes que nous verrons en suivant.

sed -e 'commandes' [Fichier d'entrée] > [Fichier de sortie]

Sans fichier de sortie sed affichera le résultat dans le terminal.

-f file

Aussi une fonction très utilisée puisqu'elle permet de lire une liste de commandes écrites préalablement dans un fichier au format .sed

sed -f [commandes.sed] [fichier d'entrée] > [Fichier de sortie]
-i sauvegarde

Permet de renommer le fichier d'entrée en fichier.bak et de modifier directement sur le fichier d'entrée.

sed -i".bak" -e ...
-s separate

Quand plusieurs fichiers sont en entrés, sed les assembles tous à la suite pour travailler.
Cette commande permet de dissociée les fichiers avec lesquels sed travail.

sed -s
-n silent

Permet de ne pas afficher dans le terminal le résultat.

sed -n -e ...

Les commandes

On attaque maintenant la partie principale du logiciel.

Sed traitera chaque commande pour chaque ligne du fichier d'entré.

La structure

Chaque commande se structure en section, séparé par le caractère "/". Aussi une commande n'est pas simplement définit par une lettre mais par celle-ci ainsi que sa ou ses structures.

1/2/3/4/... 

Exemple de commandes à :

1 section:
4d
On supprime la 4ième ligne
2 sections:
/M3/d
On supprime les lignes contenant l'objet "M3"
3 sections:
s/M1/M2/
On cherche l'objet "M1" de chaque ligne que l'on remplace par "M2"

etc...

Ainsi pour utiliser les commandes de sed, il faut les connaître c'est pourquoi je vous propose un petit listing de quelques essentiels:

  • Commandes: s, d
  • Flags: g,w
  • Les méta-caractères: Tous !
  • La syntaxe usuelle: toute !

Les commandes basiques

s Recherche & Remplace

Incontestablement la commande la plus importante de Sed.

s/1/2/

On cherche le premier objet qui correspond à 1 et on le remplace par 2 et ce pour toute les lignes.

Pour rechercher tous les objets 1 dans la ligne on utilisera le flag "g"

s/1/2/g
d Supprimer

Aussi très utilisé, elle permet de supprimer des lignes entières

2d

On vient supprimer la 2ième ligne.

/1/d

On vient supprimer toutes les lignes contenant 1

q Quitter

Elle permet de quitter sed en cours d’exécution.

4q

On quitte le programme à la 4ième ligne

/M7/q

On quitte le programme quand la première ligne contenant M7 est atteinte.

p Imprimer

Elle permet d'afficher la ligne dans le terminal ou dans un fichier extérieur Cette fonction ne sert que dans le cas où le paramètre -n est utilisé.

4/p enregistrement.txt

Ecrit la ligne 4 dans le fichier enregistrement.txt

y Transposition de caractères

Convertie dans chaque ligne les caractères en 'entrée' par leurs homologues respectifs en 'sortie'

y/ùté/uay/

Pour chaque ligne chaque

  • "ù" deviendra "u"
  • "t" deviendra "a"
  • "é" deviendra "y"
n ligne suivante

Remplace l'objet sélectionné par la ligne "suivante"

/1/n

Cherche l'objet 1 et le remplace par un saut de ligne

La syntaxe dans les commandes

, Association de sections

Il s'agit ici de limiter la recherche entre deux lignes, ainsi sed ne traitera l'action que entre l'objet 1 et 2

On peu

1,4d

Supprime les lignes 1 à 4

/1/,/2/d

Cherche la ligne contenant 1 et celle contenant 2 et supprimes tout celles entre.

On peu combiner les types objets par exemple: /1/,4

{;} Association de commandes

Ici l'objectif est d'utiliser plusieurs commandes sur une même ligne

/1/ {n;p;q} On recherche l'objet 1, on le remplace par un saut de ligne, on l'affiche, et on quitte sed.

! La négation

Ce caractère se retrouvera dans d'autres cas dans sed, ici il s'agit de définir la négation des commandes

/1/!p

On affiche toutes les lignes ne contenant pas 1

Les commandes avances

Les multi-lignes

Les commandes multi-lignes repose sur un principe celui de changer l'espace de travail: Sans ses commandes l'espace de travail de Sed est toujours la ligne simple, ici il va s'agir de rajouter la ligne suivante au sein de l'espace de travail.

N nouvelle ligne

Position la ligne suivante dans le nouvelle espace de travail

 /M3/{N,s/M3\nM4//}

Regarde la ligne contenant M3, ajoute la suivante à l'espace de travaille et change M3\nM4 par rien. En sachant que le \n caractérise passage de la ligne contenant M3 à la suivante.

D Effacer

Efface tout l'espace de travail

3 {N,D}

De la ligne 3, ajoute la ligne 4 à l'espace de travail, puis supprime le tout. Autrement dit supprime la ligne 3 et 4.

Les Flags

Les flags sont des adjectifs que l'on ajoutes aux fonctions, ils rajoutes des fonctionnalités aux commandes. On les ajoutes à la fins des fonctions comme suffixes.

g globale

Définit que la commande doit être prise en compte sur l'ensemble de la ligne.

s/a/b/

Remplace tous les a de chaque ligne par des b

k ième occurrence

Ici k est a remplacer par un chiffre ! Il définit de ne faire la commande que lors de la k ième occurrence.

s/a/b/3

Remplace le 3ième a par un b

p Affiche

Comme pour la commande p, le flag p affiche la ligne. De même ce flag n'est utile que quand la fonction -n est activé, sinon la l'enregistrement est affiché 2 fois.

s/1/2/p

Cherche et remplace 1 par 2 et l'affiche.

w Écrit

Enregistre le résultat des commandes dans un fichier.

s/1/2/w fichier.dany

Écrit à chaque fois que 1 est trouvé 2 dans fichier.dany

I Invariance de casse

Ignore les majuscules et minuscule pour la reconnaissance d'un motif

s/a/B/{I,g}

Remplace tous les A et a de chaque ligne par des B

{,} Association de flags

Comme pour les commandes on peut associer plusieurs flag entre eux.

s/1/o/{4,p}

Pour chaque ligne affiche dans le terminal "o" a chaque fois que 1 apparait 4 fois.

M Modificateur multi-ligne

Après l'ajout d'autre ligne dans un espace de travail, il permet de re-matérialiser les structures par lignes. Ainsi de redonner aux méta-caractères ^ et $ leurs fonctions dans les espaces de travail multi-lignes.

Parton d'un exemple: un fichier de deux lignes

AAA
BBB

Quand vous avez un espace contenant deux lignes (après une commande du type /AAA/{N; ...}) l'espace devient temporairement

AAA\nBBB

Aussi les caractères:

  • ^ Renvoie au caractère avant le premier A
  • $ Renvoie au caractère après le dernier B

Mais avec le flag M on aurait

  • ^ Renvoie au caractère avant le premier A et le premier B
  • $ Renvoie au caractère après le dernier A et le dernier B

Aussi un exemple de commande serait

/AAA/{N; s/^./C/M}

Sois remplace le premier caractère de chaque ligne par un C donc le résultat suivant

CAA
BAA

Les méta-caractères

Les méta caractères sont des caractères désignant d'autres caractères, définit par l'outil sed.
Ces caractères renvoie des fonctions particulières de sed mais d'autres fonctions peuvent être des caractères précédés d'un anti slash "\" (la distinction entre "/" et "\" est très très importante dans sed)

^ Début de ligne

Un "^" renvoie à la sélection d'un début de ligne, c'est un caractère dit 'vide', il ne fait qu'attribuer la conditions de début de ligne

^A

Cela sélectionne les "A" de début de ligne

$ Fin de ligne

Comme pour le début de ligne un "$" renvoie à une fin de ligne, il a les même propriété que le "^"

a$

Sélectionne les "a" en fin de ligne

& Renvoie au précédent

C'est un méta-caractère un peu particulier, puisqu'il ne sert que pour la fonction "s"

Il renvoie tout ce qui à été sélectionné avant.

s/F1000/G00 &/

Pour chaque "F1000" sed le remplace par "G00 F1000"

! La négation

Il effectue la négation du caractère précédent, ce qui n'est pas toujours évident à conceptualiser.

$!

Renvoie comme condition 'tant que la dernière ligne n'est pas atteinte'

. Quelconque

Le point correspond à n'importe quel caractère mais unique.

F.00

Sélectionne les "F!00", "Fa00", "FU00", "F100", "F900", "Fç00", ..........

Les occurrences=

Ce sont des fonctions qui sélectionnent les séquences aucune, une plusieurs occurrences de l'expression précédente

(Petite précision les objets avec des antislash "\" ne sont pas des méta-caractères mais des syntaxes, juste que quitte à parler des occurrences autant toutes les faire)

* Toutes occurrences

Il sélectionne toute les occurrences de l'expression précédente.

F10*

Sélectionne les "F1", "F10", "F100", "F1000" ...... Ou encore

.*

Sélectionne tous les caractères de la ligne.

\{i\} Occurrence déterminée

Ici i est a remplacer par des chiffres. Il sélectionne la ième occurrence de l'expression précédente.

F10\{5\}

Sélectionne "F100000"

\{i,j} Occurrences finis

Ici i et j sont a remplacer par des chiffres. Il sélectionne les occurrences comprises entre i et j de l'expression précédente.

F10\{3,5\}

Sélectionne les "F1000", "F10000" et "F100000"

\+ Occurrences Entières

Il sélectionne toutes les occurrences sauf 0 de l'expression précédente soit l’intervalle (1,+infini)

F10\+

Sélectionne les "F10", "F100", "F1000", .....

\? Occurrences booléennes

Il sélectionnes quand il y a une ou aucune occurrence de l'expression précédente

F10\?

Sélectionne les "F1" et "F10"

[] Liste standard

Associe le caractère parmi la liste "[]"

F[10]*

Sélectionne les "F1" ou "F0"

On peut d'établir rapidement des listes de caractères, comme de nombres, de lettres avec le "-"

[0-9]

Sélectionne n'importe quel chiffre entre 1 et 9

[0-9]*

Sélectionne n'importe quelle suite de chiffre, autrement dit n'importe quel nombre entier.

[A-Za-z0-9]

Sélectionne n'importe qu'elle lettre majuscule ou minuscule ou chiffre

[^] Liste inverse

Commencer une liste par un "^" sélectionne le caractère qui n'est pas mentionné dans la liste

[^a-b]

Sélectionne n'importe quel caractère qui n'est pas une lettre minuscule.

# Le commentaire

Permet de transformer la ligne en commentaire, il sert dans la création des fichier .sed

# /M4/d

Le commentaire annule la fonction.

Les syntaxes usuelles

Ici nous n'avons pas des méta-caractères mais des fonctions qui sont moins usuel que les méta-caractères, elles sont symbolisées par l'anti-slash "\" qui les précèdent. Nous en énumérerons quelques unes.

\ L'anti slash

L'anti slash est un peu à part, puisqu'il inverse le statut d'un caractère en tant que fonction ou simple caractère.

  • Soit pour une bonne partie des caractères standard sed leur attribue une fonction.
Le "\+" Renvoie la fonction des occurrences entières.
  • Soit pour tout les métacaractères, sed les transforme en caractère standard et donc annule les fonctions
Le "\*" renvoit le caractère *
\( \) et \k Les groupes

Les groupes permettent de réunir des suites d'objet et de les traiter via des méta-caractères

F\(10\)*

Sélectionne les "F", "F10", "F1010", ....


Aussi les groupes sont automatiquement numérotés dans une recherche (de 1 à 9 seulement)

s/\(groupeA\) puis \(groupeB\)/C'est \2 puis \1/

Remplace "groupeA puis groupeB" par "C'est groupeB puis groupeA"

\n Saut de ligne

Cette syntaxe remplace strictement le saut de ligne autant dans l'écriture que dans la recherche (même si pour rechercher un saut de ligne il faut utiliser les commandes multi-lignes)

s/M1/M4\nM2/

Remplace "M1" par
"M4
M2"

\t Tabulation

Expression syntaxique des tabulations.

\tF1

Équivaut à :

F1
\w et \W Caractères

"\w" est un raccourci pour [A-Za-z0-9_] Il sélectionne donc n'importe quel caractère lettre minuscule, majuscule ou chiffre ou underscore "_"

Et son inverse: "\W" est un raccourci pour [^A-Za-z0-9_] Il sélectionne donc tout autre caractère qu'une lettre minuscule, majuscule ou chiffre ou underscore "_"

Les variables

Il peut être utile dans certains cas de passer par des variables pour remplacer des expressions sans avoir à les réécrire.

var=Je suis une variable
var="Je suis une variable"
s/1/$var/

Ici nous avons créé une variable "var" contenant "Je suis une variable" avec deux syntaxes possible.

Puis nous avons renvoyé le contenu de la variable dans la substitution en l'appelant, avec "$var"

Ainsi "1" sera remplacé par "Je suis une variable"

Branches

Il est possible de créer des boucles ou de "sauter" de bout de programme en bout de programme via les branches. Aussi les boucles passant à l’étape suivante quand l'ensemble du programme à été vu.

b et : Les branches et étiquettes

Les étiquettes sont des repères qui n'ont pas d'effet en eux même.

Par contre on pourra revenir dans le programme au niveau de l'étiquette par son appel via une 'branche'

:etiq
s/chip/chips/
b etiq

Change "chip" en "chips" puis reboucle.

Branches inconditionnel

Il s'agit de placer un statut qui tant qu'il n'est pas vérifier va lancer la branche, c'est très pratique pour faire des boucles "while" ou "tant que"

:boucle
#bout de programme ....
$! b boucle

Ici le "$!" correspond à tant que la dernière ligne n'est pas atteinte, on boucle.

t et T Branches conditionnel

Ici le "t" à le même effet que le "b", au détail que le branchement n'est fait que si la substitution (plus haut) a eu lieu.

:boucle
#bout de programme dont une substitution
s/1/2/
t boucle

Tant que 1 est remplacé par 2, on reboucle.


On a aussi le "T" qui est la négation du "t", soit ne branche que si la substitution (plus haut) n'a pas eu lieu

:boucle
#Programme...
s/1/2/
T boucle

Tant que 1 n'a pas été remplacé par 2, on reboucle.

Utilisation

C'était un peu lourd, mais l'outil est puissant et pratique.
Vous pouvez lister les diverses utilisations que vous avez pu faire avec Sed.


Liens utiles