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 22/06/2023, 14:56]
193.178.219.33 hey
sed [Le 23/11/2024, 17:00] (Version actuelle)
90.51.143.2 [Fin de ligne]
Ligne 3: Ligne 3:
 ====== Sed ====== ====== Sed ======
  
-**sed** permet 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. C'est un outil très puissant. autre dans un fichier, ou encore supprimer des chaînes de caractères inutiles. C'est un outil très puissant.
  
Ligne 60: Ligne 60:
 <code bash>​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 **:**
Ligne 68: Ligne 68:
 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 bash>​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 ​(-dl'​occurrence ​**'​%'​** et tout ce qui la suit la première ​occurrence vérifiant ​(-f1)// \\+// 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 bash>​florent:​x:​1000:​1000</​code>​ <code bash>​florent:​x:​1000:​1000</​code>​
Ligne 83: 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 :
Ligne 103: Ligne 103:
 </​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 :
 <code bash>sed -e "​s|/​chemin/​vers/​un/​fichier|/​chemin/​vers/​un autre|"</​code>​ <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.
Ligne 118: Ligne 118:
 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-charriot ​(\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 bash>sed '​N;​s/​\n / /​g;​P;​D;'​ fichier</​code>​ <code bash>sed '​N;​s/​\n / /​g;​P;​D;'​ fichier</​code>​
Ligne 140: Ligne 140:
 </​file>​ </​file>​
  
-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 ligne DOS (\r\n] en fins de ligne UNIX (\n) :
 <code bash> <code bash>
 sed '​s/​^M$//'​ fichier sed '​s/​^M$//'​ fichier
Ligne 147: Ligne 147:
 <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 =====+==== Astuces rapides =====
 ||**Comment faire ?​**|**Commandes**|| ||**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 chaîne ancienneChaine par la chaîne NouvelleChaine dans le fichier toto.txt | sed -i '​s/​ancienneChaine/​NouvelleChaine/'​ /toto.txt||
Ligne 154: Ligne 154:
 ||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|| ||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 =====+==== Sed sur les fichiers d'un répertoire et ses sous-répertoires ===== 
 +Il peut-être utile de pouvoir appliquer notre commande sed sur les fichiers du répertoire courant, mais aussi dans ses sous-répertoires((src :​ https://​stackoverflow.com/​a/​35607711/​6614155)),​ pour cela on fera :\\ 
 +<code bash> 
 +grep -rl '​texte_à_rechercher_par_exple_ma_pomme'​ /​repertoire_ou_commencer_la_recherche | xargs sed -i '​s/​ma_pomme/​ma_poire/​g'​ 
 +</​code>​ 
 + 
 + 
 +==== Pour conclure =====
  
-Vous l'​aurez bien compris avec ces deux commandes en poche vous pouvez foncièrement faire tout ce que vous souhaitez. ​Je ne peux que vous encourager ​à lire la documentation concernant l'​usage et la syntaxe de ces deux commandes que vous trouverez en tapant respectivement **man sed** et **man cut** \\+Vous l'​aurez bien comprisavec cette commande, souvent associée à la commande //​cut//, ​vous pouvez foncièrement faire tout ce que vous souhaitez. ​N’hésitez pas à lire la documentation concernant l'​usage et la syntaxe de ces deux commandes que vous trouverez en tapant respectivement **man sed** et **man cut** \\
  
 Il ne vous reste plus qu'à intégrer ces connaissances à vos [[:​tutoriel:​script_shell|scripts shell]] ​ Il ne vous reste plus qu'à intégrer ces connaissances à vos [[:​tutoriel:​script_shell|scripts shell]] ​
Ligne 166: Ligne 173:
   * [[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]] FIXME (lien mort le 3/5/2023) 
   * [[https://​fr.wikipedia.org/​wiki/​Stream_Editor|page Wikipedia]]   * [[https://​fr.wikipedia.org/​wiki/​Stream_Editor|page Wikipedia]]
   * [[https://​forum.macbidouille.com/​index.php?​showtopic=128499|supprimer \n]]   * [[https://​forum.macbidouille.com/​index.php?​showtopic=128499|supprimer \n]]
  • sed.1687438577.txt.gz
  • Dernière modification: Le 22/06/2023, 14:56
  • par 193.178.219.33