Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format
PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [29/07/2014 12:29] Hypathie [Commandes de sed supportant les adressages universaux] |
utilisateurs:hypathie:tutos:sed-par-la-methode-structuraliste [30/07/2014 08:11] Hypathie [La commande s] |
||
---|---|---|---|
Ligne 21: | Ligne 21: | ||
Par défaut (sans option) sed traite le flux d'entrée et affiche sur la sortie, non seulement le flux d'entrée qu'elle enregistre, mais aussi le résultat de son traitement.\\ | Par défaut (sans option) sed traite le flux d'entrée et affiche sur la sortie, non seulement le flux d'entrée qu'elle enregistre, mais aussi le résultat de son traitement.\\ | ||
- | Le flux d'entrée peut être ce qui lui est transmis par un pipe en ligne de commandes ou un fichier passer en argument.\\ | + | Le flux d'entrée peut être ce qui lui est transmis par un pipe en ligne de commandes ou par un fichier donné en argument.\\ |
* Méthodes d'appel : | * Méthodes d'appel : | ||
Ligne 48: | Ligne 48: | ||
^options ^significations ^ | ^options ^significations ^ | ||
|''-e'' |enchaîner plusieurs commandes | | |''-e'' |enchaîner plusieurs commandes | | ||
- | |''-r'' |utiliser les expressions régulières étendues dans un script | | + | |''-r'' |utiliser les [[utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles|expressions régulières étendues]] dans un script | |
|''-n'' |mode silencieux : permet de ne rien modifier\\ associée au drapeau p (print)\\ (affichage sur la sortie standard) | | |''-n'' |mode silencieux : permet de ne rien modifier\\ associée au drapeau p (print)\\ (affichage sur la sortie standard) | | ||
|''-f'' |Les commandes sont lues à partir d'un fichier préalablement rédigé. | | |''-f'' |Les commandes sont lues à partir d'un fichier préalablement rédigé. | | ||
Ligne 125: | Ligne 125: | ||
=== Options -i avec -r , -n , -e === | === Options -i avec -r , -n , -e === | ||
- | Lorsqu'on a besoin d'adresser au moyen d'une //E.R.// étendue, et de modifier réellement, il faut associer les options ''-r'' et ''-i''.\\ | + | Lorsqu'on a besoin d'adresser au moyen d'une [[utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles|expression régulière étendue]], et de modifier réellement, il faut associer les options ''-r'' et ''-i''.\\ |
La syntaxe est toujours ''-ri'' , et non pas -ir.\\ | La syntaxe est toujours ''-ri'' , et non pas -ir.\\ | ||
On peut associer d'autres options, après ''-ri'' | On peut associer d'autres options, après ''-ri'' | ||
Ligne 151: | Ligne 151: | ||
</code> | </code> | ||
- | >Cette option permettant l'utilisation de script sed, elle va donc influer sur la grammaire globale de sed.\\ Les commandes internes de sed doivent être inscrites dans le script, ce qui influe sur la syntaxe d'appel des commandes internes. L'utilisation du tampon n'étant plus le même avec l'utilisation d'un script sed, l'effet de l'option ''-n'' va changer.\\ | + | <note tip> |
+ | Cette option permettant l'utilisation de script sed, elle va donc influer sur la possibilité d'utiliser conjointement d'autres options de sed.\\ Les commandes internes de sed doivent être inscrites dans le script, ce qui influe sur la syntaxe d'appel des commandes internes. L'utilisation du tampon n'étant plus le même avec l'utilisation d'un script sed, l'effet de l'option ''-n'' va changer.\\ | ||
//Elle implique aussi la possibilité d'utiliser les commandes de sed mises au point principalement pour l'usage de scripts sed.\\ (Voir la troisième partie "scripts sed avancés")// | //Elle implique aussi la possibilité d'utiliser les commandes de sed mises au point principalement pour l'usage de scripts sed.\\ (Voir la troisième partie "scripts sed avancés")// | ||
+ | </note> | ||
* __**Éléments de syntaxe d'un script sed :**__ | * __**Éléments de syntaxe d'un script sed :**__ | ||
Ligne 206: | Ligne 208: | ||
/([[:digit:]].){3}[[:digit:]]@lo/a\bizarre ce Nono | /([[:digit:]].){3}[[:digit:]]@lo/a\bizarre ce Nono | ||
</code> | </code> | ||
- | >Dès lors qu'on utilise l'option ''-f'', l'option ''-e'' n'est plus utilisable puisque le script enchaîne les commandes en les plaçant chacune sur une ligne ; | ||
- | >Mais l'option ''-r'' doit être utilisable puisqu'il peut y avoir dans le script sed une commande dont l'adressage est une //E.R.// étendue. | ||
- | >De même l'option ''-i'' doit être utilisable puisque un script sed doit servir à modifier un fichier texte !\\ | ||
- | Ainsi : | + | <note tip> |
+ | Dès lors qu'on utilise l'option ''-f'', l'option ''-e'' n'est plus utilisable puisque le script enchaîne les commandes en les plaçant chacune sur une ligne.\\ | ||
+ | Mais l'option ''-r'' doit être utilisable puisqu'il peut y avoir dans le script sed une commande dont l'adressage est une //E.R.// étendue.\\ | ||
+ | |||
+ | De même l'option ''-i'' doit être utilisable puisque un script sed doit servir à modifier un fichier texte !\\ | ||
+ | Cela se fait ainsi : | ||
<code user> | <code user> | ||
sed -rf script2-sed -i sed-options | sed -rf script2-sed -i sed-options | ||
</code> | </code> | ||
+ | </note> | ||
__Pour visualiser, utilisation d'une commande d'affichage ( **cat** par exemple)__ même si ''-n'' n'a pas été utilisée((Lors de l'utilisation d'un script sed sur un fichier, pour ce qui concerne les commandes d'insertion (''i''), d'ajout (''a'') et de changement (''c''), fort heureusement, par défaut, l'affichage sur la sortie standard du tampon de travail de sed est annulé.\\ Ce n'est bien sûr pas le cas pour la commande de suppression ''-s''.))\\ | __Pour visualiser, utilisation d'une commande d'affichage ( **cat** par exemple)__ même si ''-n'' n'a pas été utilisée((Lors de l'utilisation d'un script sed sur un fichier, pour ce qui concerne les commandes d'insertion (''i''), d'ajout (''a'') et de changement (''c''), fort heureusement, par défaut, l'affichage sur la sortie standard du tampon de travail de sed est annulé.\\ Ce n'est bien sûr pas le cas pour la commande de suppression ''-s''.))\\ | ||
//Attention l'utilisation de l'option ''-n'' est plus qu'inutile !\\ En l'utilisant, il ne resterait du fichier que ce qui lui aurait été ajouté.\\ La note ci-dessus en donne exemple.// | //Attention l'utilisation de l'option ''-n'' est plus qu'inutile !\\ En l'utilisant, il ne resterait du fichier que ce qui lui aurait été ajouté.\\ La note ci-dessus en donne exemple.// | ||
Ligne 305: | Ligne 309: | ||
* un numéro de ligne (les lignes sont numérotées à partir du chiffre 1); | * un numéro de ligne (les lignes sont numérotées à partir du chiffre 1); | ||
* le caractère ''$'' désignant la dernière ligne; | * le caractère ''$'' désignant la dernière ligne; | ||
- | * une expression régulière encadrée par des caractères ''/''; | + | * par l'encadrement /ER/cmd : [[utilisateurs:hypathie:tutos:sed-et-les-expressions-rationnelles|une expression régulière]] encadrée par des caractères ''/''; |
Ligne 345: | Ligne 349: | ||
</code> | </code> | ||
- | >Le titre "Ton sentiment comme atmosphère" est ajouté sur la la sortie standard. | + | >Le titre "Ton sentiment comme atmosphère" est ajouté sur la sortie standard. |
=== "a" : ajout après l'adressage=== | === "a" : ajout après l'adressage=== | ||
Ligne 352: | Ligne 356: | ||
</code> | </code> | ||
- | >Une ligne vide est ajoutée en deuxième ligne par la première ajout que si on indique au moins un caractère | + | >Pour ajouter une ligne vide en deuxième ligne avec la commande (a), il faut ajouter au moins un caractère, ici, "espace". |
- | >Il est plus simple, en cas de succession de commandes parmi lesquelles figure __une commande d'ajout__ de ligne, | + | >Pour désigner une ligne précises aux commandes qui suivent __une commande d'ajout__ de ligne, il peut être plus simple d'utiliser l'adressage par d'encadrement (par exemple ici, '' /^mon/,$s/^/ / '', ou '' 2,$s/^/ / ''). |
- | >d'utiliser l'adressage d'encadrement /^mon/. | + | |
- | + | ||
- | <code user>sed -e '1a\ ' -e '/^mon/,$s/^/ /' sed-automn.txt</code> | + | |
===Utiliser conjointement i et a === | ===Utiliser conjointement i et a === | ||
Ligne 363: | Ligne 364: | ||
* en insérant le titre "Ton sentiment comme atmosphère" | * en insérant le titre "Ton sentiment comme atmosphère" | ||
* en insérant une ligne ne comportant qu'un espace, | * en insérant une ligne ne comportant qu'un espace, | ||
- | * en ajoutant un espace à partir de la ligne /^automne/ | + | * en ajoutant un espace à partir de la ligne '' /^automne/ '' |
<code user> | <code user> | ||
Ligne 371: | Ligne 372: | ||
</code> | </code> | ||
- | >Il est à noter les adressages utilisés pour obtenir ce résultat, par rapport à ceux utilisés précédemment | + | On aurait pu utiliser utiliser la ligne de commande qui suit, pour obtenir le même résultat. |
- | >pour les exemples où les commandes i et a étaient utilisées seules. | + | |
- | + | ||
- | On aurait pu utiliser pour obtenir le même résultat : | + | |
<code user> | <code user> | ||
sed -e '1i\Ton sentiment comme atmosphère'\ | sed -e '1i\Ton sentiment comme atmosphère'\ | ||
Ligne 381: | Ligne 379: | ||
</code> | </code> | ||
+ | |||
+ | >Il est à noter quels ont été les adressages utilisés pour obtenir ce résultat, par rapport à ceux qui avaient été utilisés précédemment | ||
+ | >(pour les exemples où les commandes i et a étaient utilisées seules). | ||
>Voir la prochaine note. | >Voir la prochaine note. | ||
Ligne 448: | Ligne 449: | ||
C'est une paire d'adresses simples séparées par une virgule. Toutes les combinaisons sont possibles. | C'est une paire d'adresses simples séparées par une virgule. Toutes les combinaisons sont possibles. | ||
- | * deux numéros de ligne ''n,m**cmd_sed**'' : l'analyseur de sed traite les lignes comprises entre les deux adresses, et celles des adresses aussi.\\ | + | * deux numéros de ligne ''**n,m**cmd_sed'' : (''** n **'' et ''** m **'' sont des nombres) l'analyseur de sed traite la plage de lignes commençant de la ligne ''** n **'' jusqu'à la ligne ''** m **''.\\ |
- | * deux encadrements ''/ER1/,/ER2/'' : l'analyseur de sed traite les lignes délimitées par les //E.R// de début et de fin en prenant le nombre de lignes le plus large((c'est-à-dire, si l'E.R. de début figure entre les deux adressages, il traite le plage la plus grande.)) | + | * deux encadrements ''**/ER1/,/ER2/**'' : l'analyseur de sed traite la plage de lignes commençant à partir de la première ligne reconnue par //ER1// jusqu'à la ligne reconnue par //ER2//, en prenant le nombre de lignes le plus large((c'est-à-dire, qu'il peut y avoir une ligne avec ER1 dans la plage ''**n,/ER/**''.)) |
- | * combinaison ''n,/ER/'' : La plage est constituée à partir de la ligne numéro ''n'', jusqu'à la première ligne reconnue par le //E.R.// | + | * combinaison ''**n,/ER/**'' : La plage est constituée à partir de la ligne numéro ''** n **'', jusqu'à la première ligne reconnue par le //ER// |
- | * combinaison ''/ER/,n'' : La plage est constituée à partir de la première ligne vérifiant l'expression régulière jusqu'à la ligne de numéro ''n''. | + | * combinaison ''**/ER/,m**'' : La plage est constituée à partir de la première ligne vérifiant //ER// jusqu'à la ligne de numéro ''** m **''. |
====Les commandes de sed supportant les adressages universaux et l'adressage double==== | ====Les commandes de sed supportant les adressages universaux et l'adressage double==== | ||
Ligne 589: | Ligne 590: | ||
devient Vestale | devient Vestale | ||
</code> | </code> | ||
+ | |||
+ | >Le caractère # commande la ligne. | ||
===Lancer le script avec l'option -i === | ===Lancer le script avec l'option -i === | ||
Ligne 937: | Ligne 940: | ||
L'expression ''n ~ m'' ou ''n~m'' signifie simplement :\\ | L'expression ''n ~ m'' ou ''n~m'' signifie simplement :\\ | ||
- | " la E.R matche toutes les ''n''ième ligne(s) d'un fichier et cela en sautant un nombre de ligne égal à un écart (~) qui est lui-même égal, à la différence entre le nombre ''m'' avec la première ligne du fichier (c'est-à-dire la position ordinal 1). On connaît donc le nombre de ligne sautée en faisant toujours ''m - 1''." | + | La E.R sélectionne toutes les ''n''ième ligne(s) d'un fichier et cela en sautant un nombre de ligne(s) égal à un écart (~). Cet écart est égal à la différence __entre le nombre ''m'' avec la première ligne du fichier__ (c'est-à-dire la position ordinal 1). On connaît donc le nombre de ligne(s) sautée(s) en faisant toujours ''m - 1''." |
- | Et si ''n'' est égal à zéro, alors le E.R. match toutes les ''m''ièmes lignes à partir de la ligne ''m'' et saute ''m'' - 1 ligne(s). | + | Et si ''n'' est égal à zéro, ''n'' devient la position ordinale 1 du fichier en plus l'adressage de début. Donc la E.R. match toutes les ''m''ièmes lignes à partir de la ligne ''n'', et saute ''m'' - 1 ligne(s). |
- | * ''1 ~ 2'' : matche les lignes impaires : 1ière, 3ième, 5ième, etc.\\ En effet, de la première ligne du fichier à ''m'' (''m'' = 2), il y a 1. Il sera sauté 1 ligne non-matchée et cela à partir de la ligne n°1 (''n'' = 1). Donc la sélection concerne la première ligne et saute 1 ligne, matche la 3ième ligne et saute 1 ligne, etc. | + | * ''1 ~ 2'' : sélection des lignes impaires : 1ière, 3ième, 5ième, etc.\\ En effet, de la première ligne du fichier jusqu'à ''m'', il y a 1 (''m'' = 2 et 2 - 1 =1). Il sera sauté 1 ligne non-sélectionnée et cela à partir de la ligne n°1 (''n'' = 1 = la position ordinale). Donc la sélection concerne la première ligne, saut d'une ligne, sélection de la 3ième ligne, saut 1 ligne, etc. |
- | * ''2~3'' : matche les lignes 2 ; 5 ; 8 ; 11\\ L'écart sauté sera de 2 car de la position 3 (''m'' = 3) à la première ligne du fichier, il y a deux lignes (3-1=2), et cela commence à la deuxième ligne (''n'' = 2). Donc la deuxième ligne est matchée, deux lignes sont sautées (3ième et 4 ième), la 5 ième est matchée, etc. | + | * ''2~3'' : sélection les lignes 2 ; 5 ; 8 ; 11\\ L'écart sauté sera de 2 car l'écart entre la position 3 (''m'' = 3) et la première ligne du fichier, est de 2 lignes (3 - 1 = 2), et cela commence à la deuxième ligne (''n'' = 2). Donc la deuxième ligne est sélectionnée, deux lignes sont sautées (3ième et 4 ième), la 5 ième est sélectionnée, etc. |
- | * 10 ~ 5 : sélection des lignes 10 ; 15 ; 20 ; 25 etc. 5 - 1 = 4 : Il sera sauté 4 lignes non-matchées à partir de la ligne 10. | + | * 10 ~ 5 : sélection des lignes 10 ; 15 ; 20 ; 25 etc. (5 - 1 = 4 : Il sera sauté 4 lignes non-sélectionnées, à partir de la ligne 10). |
- | * 0~5 : sélection des lignes 5 ; 10 ; 15 etc.\\ m-1 = 5-1 = 4 lignes sautées, à partir de la cinquième ligne (''m'' = 5 ). | + | * 0~5 : sélection des lignes 5 ; 10 ; 15 etc.\\ (L'écart est égal à m - 1 = 5-1 = 4 ; donc 4 lignes sautées, à partir de la cinquième ligne (''m'' = 5 ). |
* Exemple 1: | * Exemple 1: | ||
Ligne 1286: | Ligne 1289: | ||
</code> | </code> | ||
- | >la première ligne vide est matchée par /^$/ ; | + | >La première ligne vide est validée par se correspondance avec /^$/ ; |
>puis, N rend utilisable le caractère de nouvelle ligne (\n); | >puis, N rend utilisable le caractère de nouvelle ligne (\n); | ||
- | >puis D supprime de l'espace de travail la ligne vide /^\n$/D enregistrée précédemment, | + | >puis D supprime de l'espace de travail la ligne vide /^\n$/D enregistrée précédemment; |
- | >puis il passe à la ligne suivant qui est aussi une ligne vide, il fait le même travail, | + | >puis il passe à la ligne suivant qui est aussi une ligne vide, il fait le même travail; |
>enfin, il passe à la ligne "fin" qui ne correspond pas à /^$/, et affiche le résultat avant de sortir. | >enfin, il passe à la ligne "fin" qui ne correspond pas à /^$/, et affiche le résultat avant de sortir. | ||
- | > Ainsi il peut supprimer ligne à ligne autant de ligne vide, afin que les les lignes du texte soit espace au plus d'un saut de ligne. | + | > Ainsi il peut supprimer ligne à ligne autant de lignes vides successives qu'il y en aurait, afin que toutes les lignes du texte ne soient espacées au plus que d'un seul saut de ligne. |
====La commande P (print) ==== | ====La commande P (print) ==== |