Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
sed [Le 07/08/2017, 11:04]
fabux
sed [Le 11/01/2024, 13:32] (Version actuelle)
bcag2 [Liens] suppr liens neoflow.fr, qui n'aboutissent pas depuis plus de 6 mois
Ligne 1: Ligne 1:
 {{tag>​console}} {{tag>​console}}
 ---- ----
-====== Sed - Cut ======+====== Sed ======
  
-**sed** ​et **cut** permettent ​de modifier ou de supprimer une partie d’une chaîne de caractères,​ par exemple pour remplacer un caractère par un  +**sed** ​(**s**tream **ed**itor) permet ​de modifier ou de supprimer une partie d’une chaîne de caractères,​ par exemple pour remplacer un caractère par un 
-autre dans un fichier, ou encore supprimer des chaînes de caractères inutiles. ​Ce sont des outils ​très puissants.+autre dans un fichier, ou encore supprimer des chaînes de caractères inutiles. ​C'est un outil très puissant.
  
-<​note>​Les possibilités de ces commandes ​en terme de syntaxe étant tellement vastes que nous n'​aborderons que la partie émergée de l'​iceberg (cette page étant bien évidemment perfectible dans le temps)</​note>​+<​note>​Les possibilités de cette commande ​en terme de syntaxe étant tellement vastes que nous n'​aborderons que la partie émergée de l'​iceberg (cette page étant bien évidemment perfectible dans le temps)</​note>​
  
 ===== Utilisation ===== ===== Utilisation =====
  
-Pour utiliser **sed** ou **cut**, vous devez lui fournir une chaîne à traiter. Cette chaîne peut provenir :+Pour utiliser **sed**, vous devez lui fournir une chaîne à traiter. Cette chaîne peut provenir :
  
   * d'un fichier   * d'un fichier
Ligne 16: Ligne 16:
  
 En règle générale la syntaxe est de la forme \\ En règle générale la syntaxe est de la forme \\
-"​s/​[//​occurrence_cherchée//​]/​[//​occurrence_de_substitution//​]/​[//​comportement//​]"​+"​s/​[//​occurrence_cherchée//​]/​[//​occurrence_de_substitution//​]/​[//​comportement//​]"​\\ 
 +Un exemple simple de substitution dans une liste de fichiers : 
 +<code bash>sed '​s/​occurrence_cherchée/​occurrence_de_substitution/​g'​ -i mes_fichiers*</​code>​
  
-==== sed - cut et les fichiers ====+==== sed et les fichiers ====
  
-Pour pouvoir traiter un fichier, il est nécessaire de lire le fichier à **sed.** Nous utiliserons la commande **grep** sous la forme : \\+Pour pouvoir traiter un fichier, il est nécessaire de lier le fichier à **sed.** Nous utiliserons la commande **grep** sous la forme : \\
   grep occurrence /​fichier/​a/​parcourir | sed ... \\   grep occurrence /​fichier/​a/​parcourir | sed ... \\
   grep occurrence /​fichier/​a/​parcourir | cut ... \\   grep occurrence /​fichier/​a/​parcourir | cut ... \\
 ou encore même conjointement \\ ou encore même conjointement \\
-  grep occurrence /​fichier/​a/​parcourir | cut ... |sed ... +  grep occurrence /​fichier/​a/​parcourir | cut ... | sed ...
- +
  
  
Ligne 35: Ligne 35:
  
 Ainsi nous définissons la valeur de la variable $chaine. Nous pouvons à présent appeler cette variable au besoin. Ainsi nous définissons la valeur de la variable $chaine. Nous pouvons à présent appeler cette variable au besoin.
-<​code>​echo $chaine | sed -e "s/ /_/g"</​code> ​ +<​code ​bash> 
-Donnera en réponse +echo $chaine | sed -e "s/ /_/g"  
-<​code>​ceci_est_une_chaine_de_caractères</​code>​+Donnera en réponse 
 +ceci_est_une_chaine_de_caractères 
 +</​code>​
  
 <​note>​Remplacer les espaces par des caractères est une des étapes importantes visant à substituer les caractères pouvant être mal interprétés par la suite. <​note>​Remplacer les espaces par des caractères est une des étapes importantes visant à substituer les caractères pouvant être mal interprétés par la suite.
-  * ''​mplayer mon fichier.avi''​ ne fonctionne pas tandis que ''​mplayer mon**_**fichier.avi ​fonctionnera''​+  * ''​mplayer mon fichier.avi''​ ne fonctionne pas tandis que ''​mplayer mon**_**fichier.avi'' ​fonctionnera
   * Le **g** positionné après l'​occurrence de substitution ("s/ /​_/​**g**"​) indique à **sed** de se comporter de façon globale ("​récursive"​)   * Le **g** positionné après l'​occurrence de substitution ("s/ /​_/​**g**"​) indique à **sed** de se comporter de façon globale ("​récursive"​)
 </​note>​ </​note>​
Ligne 51: Ligne 53:
   echo $USER   echo $USER
 // retourne l'​utilisateur en cours // \\ // retourne l'​utilisateur en cours // \\
-l'//​uid//​ et //gid// de l'​utilisateur est stocké dans le fichier /​etc/​passwd. +l'//​uid//​ et //gid// de l'​utilisateur est stocké dans le fichier /​etc/​passwd.\\ 
-Dans un premier temps récupérons la ligne concernant notre utilisateur (ici Florent)+Dans un premier temps récupérons la ligne concernant notre utilisateur (ici Florent).\\
 <​code>​grep $USER /​etc/​passwd</​code>​ <​code>​grep $USER /​etc/​passwd</​code>​
-// parcourir le fichier ​// **/​etc/​passwd** ​// et retourner la ligne concernant le nom de l'​utilisateur en cours //+//parcourir le fichier **/​etc/​passwd** et retourner la ligne concernant le nom de l'​utilisateur en cours//\\
 Donnera en réponse Donnera en réponse
-<​code>​florent:​x:​1000:​1000::/​home/​florent:/​bin/​bash</​code>​+<​code ​bash>​florent:​x:​1000:​1000::/​home/​florent:/​bin/​bash</​code>​
  
-vous me direz : parfait ! Et bien nous avons notre //uid// et //gid//. Certes mais le résultat est difficilement exploitable vous en conviendrez. Nous allons donc séparer de façon distincte les deux valeurs. Il nous faut pour cela analyser le résultat de la commande précédente pour définir des règles de traitement :+Vous me direz : parfait ! Et bien nous avons notre //uid// et //gid//. Certes mais le résultat est difficilement exploitable vous en conviendrez. Nous allons donc séparer de façon distincte les deux valeurs. Il nous faut pour cela analyser le résultat de la commande précédente pour définir des règles de traitement :
   - //uid// et //gid// sont sous la forme de chiffres   - //uid// et //gid// sont sous la forme de chiffres
   - les informations sont séparées par **:**   - les informations sont séparées par **:**
   - la liste des paths est introduite par **::**   - la liste des paths est introduite par **::**
  
-ces différentes remarques vont nous permettre de fixer des délimiteurs, ​+ces différentes remarques vont nous permettre de fixer des délimiteurs,​
 isolons donc la chaîne précédant les **::** du reste de la chaîne isolons donc la chaîne précédant les **::** du reste de la chaîne
-<​code>​grep $USER /etc/passwd | sed "​s/::/​%/"​ |cut -d'​%'​ -f1</​code>​ +<​code ​bash>grep $USER /etc/passwd | sed "​s/::/​%/"​ |cut -d'​%'​ -f1</​code>​ 
-// parcourir ​le fichier ​// **/​etc/​passwd** ​// et retourner la ligne concernant le nom de l'​utilisateur en cours // **|** // remplacer **(s)** les // **::​** ​// par // **%** // dans le résultat// **|** // dans le résultat, supprimer l'​occurrence // **%** // **(-d'​%'​)** et tout ce qui la suit la première ​occurrence vérifiant **(-f**1**)**// \\+// Parcourir ​le fichier **/​etc/​passwd** et retourner la ligne concernant le nom de l'​utilisateur en cours  **|** remplacer **(s)** les **::** par **%** dans le résultat **|** séparer ​le résultat ​au niveau du(des) délimiteur(s) ​**'%'** (-d) et afficher ​la première ​partie de cette séparation ​(-f1)// \\
 donnera donnera
-<​code>​florent:​x:​1000:​1000</​code>​+<​code ​bash>​florent:​x:​1000:​1000</​code>​
  
  Le principe est donc maintenant posé. Effectuons une dernière action afin de mettre en forme le résultat :  Le principe est donc maintenant posé. Effectuons une dernière action afin de mettre en forme le résultat :
- <​code>​grep $USER /etc/passwd | sed "​s/::/​%/​g"​ |cut -d'​%'​ -f1 |cut -d'​x'​ -f2 |sed -e "​s/:​\([0-9][0-9]*\)/​UID=\1\n/" ​ -e "​s/:​\([0-9][0-9]*\)/​GID=\1/"​</​code>​ + <​code ​bash>grep $USER /etc/passwd | sed "​s/::/​%/​g"​ |cut -d'​%'​ -f1 |cut -d'​x'​ -f2 |sed -e "​s/:​\([0-9][0-9]*\)/​UID=\1\n/" ​ -e "​s/:​\([0-9][0-9]*\)/​GID=\1/"​ 
-Donnera +Donnera 
-<​code>​UID=1000+UID=1000
 GID=1000 GID=1000
 </​code>​ </​code>​
Ligne 81: Ligne 83:
 |              ^ Commande ​                 ^ Sortie ​         ^ |              ^ Commande ​                 ^ Sortie ​         ^
 ^ origine ​     | grep $USER /​etc/​passwd ​   | **florent**:​x:​1000:​1000::/​home/​**florent**:/​bin/​bash | ^ origine ​     | grep $USER /​etc/​passwd ​   | **florent**:​x:​1000:​1000::/​home/​**florent**:/​bin/​bash |
-Etape 1      | sed "​s/::/​%/" ​           | florent:​x:​1000:​1000**%**/​home/​florent:/​bin/​bash ​ | +Étape ​1      | sed "​s/::/​%/" ​           | florent:​x:​1000:​1000**%**/​home/​florent:/​bin/​bash ​ | 
-Etape 2      | cut -d'​%'​ -f1             ​| ​ florent:​x:​1000:​1000 ​               | +Étape ​2      | cut -d'​%'​ -f1             | florent:​x:​1000:​1000 ​               | 
-Etape 3      | cut -d'​x'​ -f2             | :​1000:​1000 ​   | +Étape ​3      | cut -d'​x'​ -f2             | :​1000:​1000 ​   | 
-Etape 4      | sed -e "​s/:​\([0-9][0-9][0-9][0-9]\)/​UID=\1\n/" ​ -e "​s/:​\([0-9][0-9][0-9][0-9]\)/​GID=\1/"​ | UID=1000 \\ GID=1000 |+Étape ​4      | sed -e "​s/:​\([0-9][0-9][0-9][0-9]\)/​UID=\1\n/" ​ -e "​s/:​\([0-9][0-9][0-9][0-9]\)/​GID=\1/"​ | UID=1000 \\ GID=1000 |
  
 plus simple : plus simple :
-  ​sed -n -e "/​`echo $USER`/​s/​[^:​]*:​[^:​]*:​\([^:​]*\):​\([^:​]*\):​.*/​UID=\1\nGID=\2/​p"​ /​etc/​passwd +<code bash> 
 +sed -n -e "/​`echo $USER`/​s/​[^:​]*:​[^:​]*:​\([^:​]*\):​\([^:​]*\):​.*/​UID=\1\nGID=\2/​p"​ /​etc/​passwd 
 +</​code>​
  
 Voila les étapes du traitement d'une chaîne de caractères avec quelques détails à ne pas oublier. Voila les étapes du traitement d'une chaîne de caractères avec quelques détails à ne pas oublier.
 <note warning> <note warning>
-  * L'​ordre de traitement est crucial ​+  * L'​ordre de traitement est crucial
   * Le délimiteur utilisé par **cut** ne peut excéder 1 caractère d'où l'​étape 1 visant à remplacer deux caractères consécutifs par un caractère unique remarquable utilisé dans l'​étape 2   * Le délimiteur utilisé par **cut** ne peut excéder 1 caractère d'où l'​étape 1 visant à remplacer deux caractères consécutifs par un caractère unique remarquable utilisé dans l'​étape 2
   * L'​étape 4 introduit quelques syntaxes intéressantes :   * L'​étape 4 introduit quelques syntaxes intéressantes :
      - sed -e "​[règle 1]" -e "​[règle 2]" ​      - sed -e "​[règle 1]" -e "​[règle 2]" ​
      - sed "​s/​\(occurrence\)/​%\1%/"​ qui retourne %occurrence%      - sed "​s/​\(occurrence\)/​%\1%/"​ qui retourne %occurrence%
-     - sed "​s/​\(occurrence\)/​\1\n/"​ qui insère un retour ​charriot ​à la fin de l'​occurrence+     - sed "​s/​\(occurrence\)/​\1\n/"​ qui insère un retour ​à la ligne à la fin de l'​occurrence
 </​note>​ </​note>​
  
 ===== Astuces en Vrac ===== ===== Astuces en Vrac =====
  
-une syntaxe intéressante peut s'​avérer parfois très utile notamment pour des occurrences de type chemin de dossier **/​chemin/​de/​fichier**. En effet la présence de caractères **/** peut poser certains problèmes. Afin de pallier cela il est possible d'​utiliser une syntaxe différente que voici : +Une syntaxe intéressante peut s'​avérer parfois très utile notamment pour des occurrences de type chemin de dossier **/​chemin/​de/​fichier**. En effet la présence de caractères **/** peut poser certains problèmes. Afin de pallier cela il est possible d'​utiliser une syntaxe différente que voici : 
-  sed -e "​s|/​chemin/​vers/​un/​fichier|/​chemin/​vers/​un autre|"​+<code bash>sed -e "​s|/​chemin/​vers/​un/​fichier|/​chemin/​vers/​un autre|"​</​code>​
 ainsi les **/** seront correctement interprétés. ainsi les **/** seront correctement interprétés.
 +
 +<note tip>​Échappement ((https://​stackoverflow.com/​a/​5980937/​6614155)) :​ il est possible d'​échapper certains caractères spéciaux, ainsi la modification ci-dessus peut aussi s'​écrire ​
 +<code bash>sed -e "​s/​\/​chemin\/​vers\/​un\/​fichier/​\/​chemin\/​vers\/​un autre/</​code>​
 +autres caractères à échapper : " [ ] . / ? , mais pas les () qui doivent être échappées au contraire, seulement pour définir un groupe à mémoriser</​note>​
  
 Si vous désirez modifier des occurrences dans un fichier vous pouvez préférer l'​option -i qui permet d'​éditer un  fichier. Si vous désirez modifier des occurrences dans un fichier vous pouvez préférer l'​option -i qui permet d'​éditer un  fichier.
 Ainsi : Ainsi :
-  ​sed -i "s/une occurrence/​une autre/​g"​ /​un/​fichier.txt+<code bash>sed -i "s/une occurrence/​une autre/​g"​ /​un/​fichier.txt</​code>​
 Va remplacer toutes les occurrences **une occurrence** par **une autre** dans le fichier **/​un/​fichier.txt** Va remplacer toutes les occurrences **une occurrence** par **une autre** dans le fichier **/​un/​fichier.txt**
  
 === Fin de ligne === === Fin de ligne ===
  
-sed traite les lignes individuellement (l'​une ​aprés ​l'​autre),​ il semble donc, au premier abord, incapable de joindre deux lignes séparées par un motif comportant le retour chariot (\n). Heureusement cette difficulté n'est qu'​apparente : il suffit de lui indiquer de traiter les deux lignes.+sed traite les lignes individuellement (l'​une ​après ​l'​autre),​ il semble donc, au premier abord, incapable de joindre deux lignes séparées par un motif comportant le retour chariot (\n). Heureusement cette difficulté n'est qu'​apparente : il suffit de lui indiquer de traiter les deux lignes.
 Exemple : joindre à la ligne précédente chaque ligne commençant par un espace (soit substituer un espace simple aux deux caractères saut de ligne puis espace) Exemple : joindre à la ligne précédente chaque ligne commençant par un espace (soit substituer un espace simple aux deux caractères saut de ligne puis espace)
-<​code>​sed '​N;​s/​\n / /​g;​P;​D;'​ fichier</​code>​+<​code ​bash>sed '​N;​s/​\n / /​g;​P;​D;'​ fichier</​code>​
 Dans cet exemple "​N"​ indique à sed de lire également la ligne suivante, "​P"​ d'​afficher le résultat et "​D"​ d'​effacer la ligne suivante (puisqu'​elle a déjà été lue). Les différentes commandes sont séparées par des points-virgules. Dans cet exemple "​N"​ indique à sed de lire également la ligne suivante, "​P"​ d'​afficher le résultat et "​D"​ d'​effacer la ligne suivante (puisqu'​elle a déjà été lue). Les différentes commandes sont séparées par des points-virgules.
  
Ligne 126: Ligne 133:
  aux heureux utilisateurs de cette distribution.  aux heureux utilisateurs de cette distribution.
 </​file>​ </​file>​
-devient ​:+deviens ​:
 <​file>​ <​file>​
 Aujourd'​hui Ubuntu est incontestablement un beau succès. Aujourd'​hui Ubuntu est incontestablement un beau succès.
Ligne 134: Ligne 141:
  
 Et pour finir la commande à saisir pour transformer les fins de lignes DOS (\r\n] en fins de ligne UNIX (\n) : Et pour finir la commande à saisir pour transformer les fins de lignes DOS (\r\n] en fins de ligne UNIX (\n) :
-<​code>​+<​code ​bash>
 sed '​s/​^M$//'​ fichier sed '​s/​^M$//'​ fichier
 </​code>​ </​code>​
 Où "​^M"​ représente \r. Où "​^M"​ représente \r.
 <note tip>en mode console l'​affichage de ^M peut s'​obtenir en saisissant CTRL+V puis CTRL+M</​note>​ <note tip>en mode console l'​affichage de ^M peut s'​obtenir en saisissant CTRL+V puis CTRL+M</​note>​
 +
 +=== Astuces rapides =====
 +||**Comment faire ?​**|**Commandes**||
 +||Remplacer la chaîne ancienneChaine par la chaîne NouvelleChaine dans le fichier toto.txt | sed -i '​s/​ancienneChaine/​NouvelleChaine/'​ /toto.txt||
 +||Remplacer la ligne complète qui commence par la chaîne ancienneChaine par la chaîne NouvelleChaine dans le fichier toto.txt | sed -i '​s/​ancienneChaine.*/​NouvelleChaine/'​ /toto.txt||
 +||Remplacer la ligne complète qui contient la chaîne ancienneChaine par la chaîne NouvelleChaine dans le fichier toto.txt | sed -i '​s/​.*ancienneChaine.*/​NouvelleChaine/'​ /toto.txt||
 +||Remplacer dans chaque ligne contenant '​foo'​ la chaîne ancienneChaine par la chaîne NouvelleChaine dans le fichier toto.txt |sed -i '/​foo/​s/​./​ancienneChaine/​NouvelleChaine/​g'​ toto.txt||
 +
 === Pour conclure ===== === Pour conclure =====
  
Ligne 147: Ligne 162:
 ===== Liens ===== ===== Liens =====
   * [[http://​www.panix.com/​~elflord/​unix/​sed.html|Tutorial SED]] (en) : tutoriel qui explique entres autres comment faire de la recherche multiligne   * [[http://​www.panix.com/​~elflord/​unix/​sed.html|Tutorial SED]] (en) : tutoriel qui explique entres autres comment faire de la recherche multiligne
-  * [[http://​www.commentcamarche.net/​faq/​9536-sed-introduction-a-sed-part-i|Explications completes]] (fr) : très bon tutoriel sur l'​utilisation de sed ainsi que de tres bonnes explications du fonctionnement+  * [[https://​www.commentcamarche.net/​faq/​9536-sed-introduction-a-sed-part-i|Explications completes]] (fr) : très bon tutoriel sur l'​utilisation de sed ainsi que de tres bonnes explications du fonctionnement
   * [[http://​www.shellunix.com/​sed.html | Tutorial SED]] (fr) : petit tutoriel simple en français   * [[http://​www.shellunix.com/​sed.html | Tutorial SED]] (fr) : petit tutoriel simple en français
   * [[http://​www.scotchlinux.tuxfamily.org/​doc/​sed.php|Man de SED illustrée]](fr):​ Ce qu' on apprend ​ à partir de la page de manuel de sed.   * [[http://​www.scotchlinux.tuxfamily.org/​doc/​sed.php|Man de SED illustrée]](fr):​ Ce qu' on apprend ​ à partir de la page de manuel de sed.
   * [[http://​man2linux.blogspot.com/​2010/​11/​sed.html|SED explications]] (fr) : Exemples sur l'​utilisation de la commande SED   * [[http://​man2linux.blogspot.com/​2010/​11/​sed.html|SED explications]] (fr) : Exemples sur l'​utilisation de la commande SED
-  * [[http://​www.neoflow.fr/​tutoriels.item.237/​Trier-les-lignes-d-un-fichier-selon-un-mot.html|Trier les lignes d'un fichier selon un mot avec SED]] 
-  * [[http://​www.neoflow.fr/​tutoriels.item.236/​Enlever-les-commentaires-d%27un-fichier.html|Enlever les commentaires d'un fichier avec SED]] 
   * [[https://​fr.wikipedia.org/​wiki/​Stream_Editor|page Wikipedia]]   * [[https://​fr.wikipedia.org/​wiki/​Stream_Editor|page Wikipedia]]
-  * [[http://​forum.macbidouille.com/​index.php?​showtopic=128499|supprimer \n]] +  * [[https://​forum.macbidouille.com/​index.php?​showtopic=128499|supprimer \n]] 
-  * [[http://​www.commentcamarche.net/​faq/​5978-sed-conversion-retours-chariots-dos-crlf-unix-lf|retour chariot DOS]]+  * [[https://​www.commentcamarche.net/​faq/​5978-sed-conversion-retours-chariots-dos-crlf-unix-lf|retour chariot DOS]]
  
 ---- ----
-Contributeurs : [[utilisateurs/​va-nu-pied|flo|va-nu-pied]]+Contributeurs : [[utilisateurs/​va-nu-pied|flo|va-nu-pied]], [[utilisateurs/​bcag2]]
  • sed.1502096661.txt.gz
  • Dernière modification: Le 07/08/2017, 11:04
  • par fabux