Outils pour utilisateurs

Outils du site


linux:sed (lu 59809 fois)

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
Prochaine révision Les deux révisions suivantes
linux:sed [15-02-2013 11:33]
edmc73
linux:sed [16-04-2014 09:54]
edmc73 [Regexp extended]
Ligne 41: Ligne 41:
      
 ==== Suppression ==== ==== Suppression ====
 +Pour supprimer la 1ère ligne d'un fichier
 +  sed -e '1d' fichier.txt
 +Pour supprimer toutes les lignes sauf la 1ère 
 +  sed -e '1!d' fichier.txt
 +Pour supprimer les lignes de 3 à 7
 +  sed -e '3,7d' fichier.txt
 +Pour n'afficher que les lignes de 3 à 7
 +  sed -e '3,7!d' fichier.txt
 +
 Pour supprimer toutes les lignes de commentaire qui commence par exemple par **#**, on utilise l'option **d** pour delete à la fin de la commande Pour supprimer toutes les lignes de commentaire qui commence par exemple par **#**, on utilise l'option **d** pour delete à la fin de la commande
   sed -e '/^#/d' fichier.txt   sed -e '/^#/d' fichier.txt
Ligne 50: Ligne 59:
 Avec les **[ ]** et spécifie que la ligne commente par un **#** ou un **;**. Le **;** suivant veut dire que nous lançons une autre commande, celle ci dit que nous cherchons une ligne vide. **^** indique le début de la ligne et **$** la fin. **/d** on delete. Avec les **[ ]** et spécifie que la ligne commente par un **#** ou un **;**. Le **;** suivant veut dire que nous lançons une autre commande, celle ci dit que nous cherchons une ligne vide. **^** indique le début de la ligne et **$** la fin. **/d** on delete.
  
 +Supprimer les lignes qui contient un message d'erreur
 +  sed -e '/HTTP accept: Too many open files/d' pound.log.1 > pound.log.clean.1
 +
 +Éliminer les espaces et tabulations
 +En début de ligne
 +  sed 's/^[ \t]*//
 +  sed 's/^\s*//'        # Utilisation du paramètre "\s"
 +  
 +En fin de ligne
 +  sed 's/[ \t]*$//'
 +  
 +En début et fin de ligne
 +  sed 's/^[ \t]*//;s/[ \t]*$//'
 ==== Expressions régulières ==== ==== Expressions régulières ====
 Prenons le cas de la commande **df** qui permet d'afficher l'espace disque de notre machine. Nous aimerions récupérer ces données pour les transmettre dans un format CSV avec des **;** comme séparateur. Prenons le cas de la commande **df** qui permet d'afficher l'espace disque de notre machine. Nous aimerions récupérer ces données pour les transmettre dans un format CSV avec des **;** comme séparateur.
Ligne 67: Ligne 89:
 Comme on veut pouvoir récupérer ces champs, on va les mettre entre parenthèses mais pour que sed ne croit pas que l'on cherche des parenthèses, nous devons les échapper par un backslash Comme on veut pouvoir récupérer ces champs, on va les mettre entre parenthèses mais pour que sed ne croit pas que l'on cherche des parenthèses, nous devons les échapper par un backslash
   \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)   \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)
 +Maintenant entre chaque champ nous avons un ou plusieurs espaces, ou pourrait écrire l'expression [:space:]+ mais sed ne reconnait pas le caractère **+** permettant de dire que l'on veut au moins de une occurrence à plusieurs.
 +Il faudrait ruser en écrivant ceci [:space:][:space]* 
 +
 +Nous allons faire plus simple en lançant une première commande permettant de remplacer toutes les suites d'espaces par un seul espace sur toutes les occurrences rencontrées sur la ligne.
 +  sed -e 's/[ ][ ]*/ /g'
 +On obtient au final la commande 
 +  df | sed -e 's/[ ][ ]*/ /g' -e 's/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/\1;\2;\3;\4;\5;\6/'
 +
 +Si on voulait ne récupérer que le pourcentage d'occupation
 +  df | sed -e '1d;s/.* \([0-9]*\)% .*/\1/'
 +Ici on a rajouté **1d** qui permet de supprimer la 1ère ligne.
 +
 +===== Exemple en vrac =====
 +
 +Source
 +<code>dublablacodecode<a href="/chemin/bien/precis/fichier.xyz">OnSenFoutDuNom</a>dublablacode
 +dublablacodecode<a href="/chemin/bien/precis/fichier2.xyz">OnSenFoutDuNom</a>dublablacode</code>
 +
 +Résultat
 +<code>fichier.xyz
 +fichier2.xyz</code>
 +
 +Sed
 +<code>sed -r 's/.*href=".*[$/](.*)".*/\1/' fichierSource</code>
 +
 +Extraire la date et la reformaté dans un nom de fichier
      
-Le caractère **+** permettant de dire que l'on veut au moins de une occurence à plusieurs ne fonctionne pas sous sed, il faut écrire comme suit : L'expression « ^[0-9][0-9]* » signifie qu'on adresse les lignes qui débutent par un chiffre de à (premiers crochets), suivi d'un autre chiffre de à ( deuxièmes crochets répété de 0 à n fois ( * ) +  $ echo Pict_20140215_0945.jpg | sed -r 's/.*([0-9]{4})([0-9]{2})([0-9]{2})_([0-9]{2})([0-9]{2}).*/\3-\2-\1 \4:\5/' 
 +  15-02-2014 09:45 
 + 
 +===== Regexp extended ===== 
 + 
 +On peut mettre l'option -r à la place de l'option -e et voici la différence 
 + 
 +>Appendix A Extended regular expressions 
 +
 +>The only difference between basic and extended regular expressions is in the behavior of a few characters: ‘?’, ‘+’, parentheses, and  braces (‘{}’). While basic regular expressions require these to be escaped if you want them to behave as special characters, when using extended regular expressions you must escape them if you want them to match a literal character. 
 +
 +>Examples: 
 +
 +>abc? -> ‘abc\?’ when using extended regular expressions. It matches the literal string ‘abc?’.  
 +>c\+ ->  ‘c+’ when using extended regular expressions. It matches one or more ‘c’s.  
 +>a\{3,\} -> ‘a{3,}’ when using extended regular expressions. It matches three or more ‘a’s.  
 +>\(abc\)\{2,3\} -> ‘(abc){2,3}’ when using extended regular expressions. It matches either ‘abcabc’ or ‘abcabcabc’.  
 +>\(abc*\)\1 -> ‘(abc*)\1’ when using extended regular expressions. Backreferences must still be escaped when using extended regular expressions. 
 + 
linux/sed.txt · Dernière modification: 04-10-2020 12:00 de edmc73