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 | ||
linux:sed [25-02-2012 22:37] edmc73 Page moved from linux:edmc73:linux:sed to linux:edmc73:linux:edmc73:sed |
linux:sed [16-04-2014 10:08] edmc73 [Extraire la valeur d'un test avec hdparm] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ===== sed ===== | + | ====== sed ====== |
- | encore une ébauche d'un mémo... | + | ===== Description ===== |
+ | **sed** est un outils très puissant permettant de transformer le texte du flux entrant. | ||
- | J' | + | Doc très détaillé : |
+ | * http://www.siteduzero.com/ | ||
+ | * http:// | ||
- | sed c'est de la forme : 's/ce_qu' | + | ===== Exemples ===== |
+ | |||
+ | ==== Remplacement / substitution ==== | ||
+ | Prenons un fichier exemple | ||
+ | < | ||
+ | toto 1234 toto titi | ||
+ | tata 4321 toto tutu | ||
+ | </ | ||
+ | |||
+ | Pour remplacer | ||
+ | | ||
- | + | < | |
- | + | koko 1234 toto titi | |
- | D' | + | tata 4321 koko tutu |
- | + | </ | |
- | n' | + | |
- | .* url=' | + | |
- | + | ||
- | on peut capturer un truc pour le ressortir avec \1 plus tard, d'où les parenthèses | + | |
- | \( et plus loin \) | + | |
- | + | ||
- | tout sauf ', plein de fois (quand tu mets [^c] ca veut dire tout sauf c) | + | |
- | [^' | + | |
- | + | ||
- | suivi de : ' puis d' | + | |
- | .* | + | |
- | + | ||
- | d'où la regexp (sans les parenthèses) .* url=' | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | Si tu regardes ton nouveau truc que tu veux filtrer, tu vois qu'on passe de : | + | |
- | url='blablabla' | + | On peut remarquer que seul la 1ère occurence est remplacé, pour remplacer toutes les occurences, on utilise l'option **g** à la fin de la commande |
+ | sed -e 's/ | ||
+ | < | ||
+ | koko 1234 koko titi | ||
+ | tata 4321 koko tutu | ||
+ | </ | ||
+ | ==== Translittération ==== | ||
+ | Pratique pour par exemple remplacer tous les e avec accent par un e sans accent. | ||
+ | sed -e ' | ||
+ | | ||
+ | Ou pour crypter/ | ||
+ | sed -e ' | ||
+ | | ||
+ | ==== Suppression ==== | ||
+ | Pour supprimer la 1ère ligne d'un fichier | ||
+ | sed -e ' | ||
+ | Pour supprimer toutes les lignes sauf la 1ère | ||
+ | sed -e ' | ||
+ | Pour supprimer les lignes de 3 à 7 | ||
+ | sed -e ' | ||
+ | Pour n' | ||
+ | sed -e ' | ||
- | à : | + | Pour supprimer toutes les lignes de commentaire qui commence par exemple par **#**, on utilise l' |
+ | sed -e '/ | ||
+ | A contrario, si nous voulons que les lignes qui commencent par un #, on ajoute un **!** devans l' | ||
+ | sed -e '/ | ||
+ | |||
+ | Exemple avec un fichier de conf qui comporte des lignes commentés avec un **;** et qui comportent beaucoup de lignes vide. | ||
+ | sed -e '/ | ||
+ | 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. | ||
- | url=" | + | Supprimer les lignes qui contient un message d' |
+ | sed -e '/HTTP accept: Too many open files/ | ||
+ | Éliminer les espaces et tabulations | ||
+ | En début de ligne | ||
+ | sed 's/^[ \t]*// | ||
+ | sed ' | ||
+ | | ||
+ | En fin de ligne | ||
+ | sed 's/[ \t]*$//' | ||
+ | | ||
+ | En début et fin de ligne | ||
+ | sed 's/^[ \t]*//;s/[ \t]*$//' | ||
+ | ==== Expressions régulières ==== | ||
+ | Prenons le cas de la commande **df** qui permet d' | ||
- | + | Nous devons travailler sur ce genre de donnée: | |
- | Il faut donc travailler avec des " dans sed, au lieu des ' | + | < |
- | .* url='\([^']*\).* | + | Sys. de fichiers |
- | à : | + | / |
- | .* url="\([^"]*\).* | + | tmpfs 4099408 |
- | + | udev | |
- | + | tmpfs 4099408 | |
- | Evidemment pour que sed ne merde pas, il faut soit utiliser des \" au lieu des " (sinon au premier " sed va croire | + | </ |
- | + | On va imaginer un découpage basic de la sorte | |
- | Bilan : on passe de | + | champ1 champ2 champ3 champ4 champ5 champ6 |
+ | Un champ est zéro ou plusieurs n'importe quel caractère ce qui se traduit parun point suivi d'une étoile | ||
+ | | ||
+ | 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, | ||
+ | \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\) | ||
+ | Maintenant entre chaque champ nous avons un ou plusieurs espaces, ou pourrait écrire l' | ||
+ | Il faudrait ruser en écrivant ceci [:space: | ||
- | sed -e "s/.*url='\([^' | + | Nous allons faire plus simple en lançant une première commande permettant de remplacer toutes les suites d' |
+ | | ||
+ | On obtient au final la commande | ||
+ | df | sed -e 's/[ ][ ]*/ /g' -e 's/\(.*\) \(.*\) \(.*\) \(.*\) \(.*\) \(.*\)/\1; | ||
+ | Si on voulait ne récupérer que le pourcentage d' | ||
+ | df | sed -e ' | ||
+ | Ici on a rajouté **1d** qui permet de supprimer la 1ère ligne. | ||
- | à : | + | ===== Exemple en vrac ===== |
- | sed -e ' | + | Source |
+ | < | ||
+ | dublablacodecode< | ||
+ | |||
+ | Résultat | ||
+ | < | ||
+ | fichier2.xyz</ | ||
+ | |||
+ | Sed | ||
+ | < | ||
+ | |||
+ | ==== Extraire la date et la reformaté dans un nom de fichier ==== | ||
+ | |||
+ | |||
+ | $ 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: | ||
+ | 15-02-2014 09:45 | ||
+ | |||
+ | ==== Extraire la valeur d'un test avec hdparm ==== | ||
+ | On veut récupérer la valeur 64.66 | ||
+ | < | ||
+ | |||
+ | /dev/sda: | ||
+ | | ||
+ | |||
+ | hdparm -t /dev/sda | sed -r '/ | ||
+ | |||
+ | Avec le ''/ | ||
+ | '' | ||
+ | On prend la valeur jusqu' | ||
+ | ===== Regexp extended ===== | ||
+ | |||
+ | On peut mettre l' | ||
+ | |||
+ | > | ||
+ | > | ||
+ | >The only difference between basic and extended regular expressions is in the behavior of a few characters: ‘?’, ‘+’, parentheses, | ||
+ | > | ||
+ | > | ||
+ | > | ||
+ | >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. | ||
+ | > | ||
+ | > | ||
- | |||
- | Juste une inversion des types de guillemets en fait ;) |