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 | ||
linux:sed [25-02-2012 22:32] edmc73 Page moved from linux:sed to linux:edmc73:linux:sed |
linux:sed [04-10-2020 12:00] (Version actuelle) edmc73 [Remplacement / substitution] |
||
---|---|---|---|
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'on_cherche/ | + | ===== Exemples ===== |
- | + | ||
- | + | ==== Remplacement / substitution ==== | |
- | + | Prenons un fichier exemple | |
- | D'abord ce qu'on cherche avec ça (en rouge la version regexp) : | + | < |
+ | toto 1234 toto titi | ||
+ | tata 4321 toto tutu | ||
+ | </ | ||
+ | |||
+ | L'option | ||
+ | |||
+ | Pour remplacer | ||
+ | sed -i 's/ | ||
- | n' | + | < |
- | .* url=' | + | koko 1234 toto titi |
- | + | tata 4321 koko tutu | |
- | 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 seule la 1ère occurrence est remplacée, pour remplacer toutes les occurrences, |
+ | sed -i 's/ | ||
+ | < | ||
+ | koko 1234 koko titi | ||
+ | tata 4321 koko tutu | ||
+ | </ | ||
+ | Pour ignorer la casse, on utilise l' | ||
+ | sed -i ' | ||
- | à : | + | Remplacer un \ par / dans les path des #include dans un fichier .c |
+ | sed -i '/# | ||
+ | sed -i '/# | ||
+ | sed -i '/# | ||
+ | |||
+ | Pour remplacer dans l' | ||
- | url=" | + | find . -name ' |
+ | et inversement | ||
+ | find . -name ' | ||
+ | ==== 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. | ||
- | + | Supprimer les lignes qui contient un message d' | |
- | Il faut donc travailler avec des " dans sed, au lieu des '. Donc on passe de : | + | |
- | .* url=' | + | |
- | à : | + | |
- | .* url=" | + | |
- | + | ||
- | + | ||
- | Evidemment pour que sed ne merde pas, il faut soit utiliser des \" au lieu des " (sinon au premier " sed va croire que la commande s' | + | |
- | + | ||
- | Bilan : on passe de | + | |
- | sed -e "s/.*url='\([^']*\).*/\1/" | + | Éliminer les espaces et tabulations |
+ | En début de ligne | ||
+ | | ||
+ | sed 's/^\s*//' | ||
+ | |||
+ | En fin de ligne | ||
+ | sed 's/[ \t]*$//' | ||
+ | |||
+ | En début et fin de ligne | ||
+ | sed ' | ||
+ | ==== Expressions régulières ==== | ||
+ | Prenons le cas de la commande **df** qui permet d' | ||
+ | Nous devons travailler sur ce genre de donnée: | ||
+ | < | ||
+ | Sys. de fichiers | ||
+ | / | ||
+ | tmpfs 4099408 | ||
+ | udev | ||
+ | tmpfs 4099408 | ||
+ | </ | ||
+ | On va imaginer un découpage basic de la sorte | ||
+ | champ1 champ2 champ3 champ4 champ5 champ6 | ||
+ | Un champ est zéro ou plusieurs n' | ||
+ | .* .* .* .* .* .* | ||
+ | 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 [: | ||
- | à : | + | Nous allons faire plus simple en lançant une première commande permettant de remplacer toutes les suites d' |
+ | sed -e 's/[ ][ ]*/ /g' | ||
+ | On obtient au final la commande | ||
+ | df | sed -e 's/[ ][ ]*/ /g' -e ' | ||
- | sed -e ' | + | Si on voulait ne récupérer que le pourcentage d' |
+ | df | sed -e '1d;s/.* \([0-9]*\)% .*/ | ||
+ | Ici on a rajouté **1d** qui permet de supprimer la 1ère ligne. | ||
+ | |||
+ | ===== Exemple en vrac ===== | ||
+ | |||
+ | 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' | ||
+ | |||
+ | |||
+ | ==== Connaitre les machines connectées à notre serveur NFS ==== | ||
+ | |||
+ | < | ||
+ | |||
+ | |||
+ | |||
+ | ===== 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 ;) |