Travailler avec des expressions rationnelles

84
8
fév.
2016
Technologie

Les expressions rationnelles sont un outil d’analyse de texte par un ordinateur. Elles permettent de décrire des enchaînements de caractères d’une complexité suffisamment grande pour être réellement utiles, mais suffisamment faible pour être implémentées efficacement. Elles sont d’une importance capitale pour le théoricien des langages comme pour l’UNIX power user.

Dans cette dépêche, nous :

  • décrivons brièvement la notion abstraite d’expression rationnelle et recensons les implémentations les plus courantes sur un système Unix ;
  • présentons quelques commandes permettant de rechercher des motifs décrits par une expression rationnelle dans un texte, réécrire des fichiers automatiquement ou transformer et analyser des fichiers structurés automatiquement en utilisant des expressions rationnelles ;
  • montrons comment améliorer votre productivité avec Emacs grâce aux expressions rationnelles.

Dans cette dépêche, nous allons nous pencher sur les expressions rationnelles (souvent nommées abusivement expressions régulières suite à une traduction littérale de regular expression). Elles permettent de représenter formellement un motif de recherche, par exemple : un caractère alphabétique majuscule suivi de quatre caractères minuscules, puis deux chiffres et un point à la fin. Les expressions rationnelles représentent un outil puissant pour qui sait les utiliser à bon escient mais nécessitent une phase d’apprentissage non négligeable. La diversité des moteurs et des syntaxes n’aide pas non plus à leur simplicité, et les confusions entre les différents outils peuvent parfois donner des résultats surprenants.

Journal Ligne de commande : les 20 mémos d'un « autodidacte »

Posté par  (site web personnel) . Licence CC By‑SA.
44
4
oct.
2018

Depuis avril 2018 j'ai eu l'occasion de publier sur le Grimoire-Command.es les 20 mémos du précédent secrétaire de Gebull (le LUG de Bressuire).

Les sujets abordés sont variés et représentent quelques décennies de lecture de forum et de tâtonnements, scrupuleusement notés et repris en fiches synthétiques.

Comme le reste du grimoire, ce sont des mémos, des penses-bêtes, pour retrouver rapidement une commande que l'on a déjà utilisée ou aperçue. Comme pour les grimoires de jeux de rôle, il faut donc (…)

Journal Grabuge à la FSF : GnuTLS quitte le projet GNU et sed perd son mainteneur

Posté par  (site web personnel) . Licence CC By‑SA.
44
23
déc.
2012

Peuple de LinuxFr, l'heure est grave.

Alors que ploum trolle sans vergogne sur l'intégrisme de la FSF, des critiques bien plus concrètes, informées et graves se font jour en ce mois de décembre.

D'abord, le 10 décembre, Nikos Mavrogiannopoulos annonce que le projet GnuTLS quitte l'égide de GNU après 12 ans. En cause, « un désaccord majeur avec les décisions et pratiques de la FSF ». Le site LWN a publié un article sur le sujet cette semaine, chroniquant cette tentative de (…)

Journal Lire de fichiers de configuration depuis un script shell

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
25
5
juin
2015

La petite technique shell du vendredi. Pour lire un fichier de configuration du style INI depuis un script shell, on peut utiliser le petit script sed suivant

1 {
  x
  s/^/default/
  x
}

/^#/n

/^\[/ {
  s/\[\(.*\)\]/\1/
  x
  b
}

/=/ {
  s/^[[:space:]]*//
  s/[[:space:]]*=[[:space:]]*/|/
  G
  s/\(.*\)\n\(.*\)/\2|\1/
  p
}

Il transforme

    # last modified 1 April 2001 by John Doe
    [owner]
    name=John Doe
    organization=Acme Widgets Inc.

    [database]
    # use IP address in case network name resolution is not working
    server=192.0.2.62
    port=143
(…)

Forum Programmation.shell Je ne pipe rien à ce pipe

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
5
11
avr.
2020

J'ai une commande dont je voudrais filtrer une certaine ligne :

$ sudo dnf history | head
ID   | Ligne de commande        | Date et heure    | Action(s)      | Modifié
-------------------------------------------------------------------------------
1024 | install gammaray         | 2020-04-11 01:18 | Install        |    7
1023 | update                   | 2020-04-10 19:03 | Upgrade        |   51
1022 | update --refresh         | 2020-04-09 18:35 | Upgrade        |    1
1021 | update                   | 2020-04-08 19:19 
(…)

Forum Programmation.autre Sed sur plusieurs lignes

Posté par  . Licence CC By‑SA.
Étiquettes :
2
26
août
2014

Bonjour,

Utilisateur de sed depuis des lustres… il y a un truc que je n'arrive pas à faire… et qui me chicane vraiment. J'ai toujours contourné le problème avec du Perl, mais, cette fois, c'est pour de l'embarqué (en fait une raspberry pi que je ne contrôle pas) et je n'ai pas de Perl à disposition.

Le problème

J'ai de nombreux fichiers qui ont un nombre variable de lignes de la forme:

%!PostProc(Xhtml): 'bidule' 'capsule'

Mais il peut y avoir (…)

Forum Linux.général Que prendre entre sed et awk ?

Posté par  .
Étiquettes :
2
30
août
2011

Bonjour tout le monde,

je me demande lequel de ces outils, entre sed et awk, est le plus adapté à ce que je veux faire.
Je voudrais prendre sur l'entrée standard (fichier ou par tube) un texte, vérifier chaque mot par des expressions régulières et, selon l'expression trouvée pour le mot, l'entourer par des balises (disons des balises HTML).
La sortie est un fichier texte ou alors la sortie standard.

J'ai lu les articles sed et awk sur Wikipédia (…)

Forum Programmation.shell Utiliser la sortie d'une commande comme chaîne de recherche de awk

Posté par  . Licence CC By‑SA.
Étiquettes :
1
23
déc.
2013

Bonjour.

Je cherche à obtenir le "device file" correspondant à un chemin (sur une clé USB, en l'occurrence).

Disons que mon chemin est /media/cle/rep1/rep2/rep3/fichier. (J'ai accès à ça facilement dans Thunar via les actions personnalisées.)

Je veux :

  • extraire /media/cle
  • chercher ça dans /proc/mounts
  • en déduire /dev/sdb1 (par exemple)

Partant de /media/cle, je peux réaliser les étapes 2 et 3 avec awk :

awk '/\/media\/cle/ {print $1}' /proc/mounts

J'arrive à extraire /media/cle avec sed :

echo /media/cle/rep1/rep2/rep3/fichier | sed -e 
(…)

Forum général.général [sed] Remplacer du texte contenu dans une variable et contenant des () et *

Posté par  (site web personnel) . Licence CC By‑SA.
1
20
mai
2017

Edit du 22/05/17 à 12h30 : J'en suis là

Quand je fais :

sed -i -e "s/TRUC:(1000)\*80/TRUC:(1000)\*99/" fichier

Le fichier est correctement modifié. Mais avec le code suivant, ça ne marche pas, le fichier n'est pas modifié :

old_value="(1000)\*80"
new_value="(1000)\*99"
sed -i -e "s/TRUC:'$old_value'/TRUC:'$new_value'/" fichier

Post original :

J'ai plusieurs fichiers de config. à modifier comme suit :

config.js :

param_un:valeur_1,
param_deux:valeur_2,

Pas trop dur :

param_a_modifier="param_un"
ancienne_valeur="valeur_1"
nouvelle_valeur="valeur_3"
sed -i -e 's/${param_a_modifier}:${ancienne_valeur}/${param_a_modifier}:${nouvelle_valeur/' config.js

Jusque là tout va bien. Sauf (…)

Forum Programmation.shell Isoler une chaine de caractère et compter son nombre d'occurrences

Posté par  . Licence CC By‑SA.
Étiquettes :
1
4
juin
2014

Hello,

Je cherche un moyen d'extraire d'une capture de mon trafic DNS certains sites et d'en afficher le nombre d’occurrence.

Le fichier que je récupère est sous ce format :

14:15:37.837411 IP 109.215.228.235.23582 > 81.253.149.2.53: 25335+ A? b.fc.namequery.com. (36)
14:15:37.837930 IP 80.10.202.65.30568 > 209.53.113.4.53: 59709 [1au] A? b.fc.namequery.com. (47)
14:15:44.746399 IP 109.215.90.49.1024 > 81.253.149.2.53: 7376+ A? search.namequery.com. (38)
14:15:49.456342 IP 82.121.161.41.1024 > 81.253.149.1.53: 26292+ A? search.namequery.com. (38)
14:15:49.456865 IP 80.10.202.103.3499 > 209.53.113.6.53: 27871 [1au] A? search.namequery.com. (49)
14:15:53.477188 IP 90.21.150.38.1024 (…)

Forum Programmation.shell Formater fichier de sortie vers colonnes CSV

Posté par  . Licence CC By‑SA.
Étiquettes :
1
30
juil.
2019

Bonjour à tous,

Je cherche de l'aide.
J'ai un fichier généré par SQL, sur lequel j'aimerai séparer les lignes existantes, vers un format de type "Colonne CSV".
Je sais que SQL peut sortir un CSV directement, mais les contraintes de l'environnement sur lequel je travaille m'obligent à passer par un fichier "temporaire"
Je n'arrive pas à trouver la bonne technique pour modifier ce formatage.

Ci-dessous l'exemple de fichier, je souhaite le "transformer" en un CSV séparé par des "," par (…)

Forum Programmation.shell enlever les fins de ligne du résultat de curl

Posté par  . Licence CC By‑SA.
Étiquettes :
1
16
mai
2014

Bonjour.

Je souhaite récupérer le retour d'une API web interne via curl, pour la comparer à un résultat prédéterminé ( en fait, de jouer des tests sans me casser les pieds à devoir me retaper le copier/coller partiel en fonction du serveur ni devoir lire le résultat pour être sûr qu'il est bon ).
Donc, j'ai créé un fichier contenant mes listes de paramètres et un script qui appelle l'URI voulue ( un serveur ou l'autre, principalement ) en ajoutant (…)