Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/04/2020, à 19:18

philoeil

[RESOLU] demande d'aide pour une expression regex

Bonjour,

J'echoue lamentablement à trouver l'expression regex dans un sed qui permettrait pour le texte suivant d’éliminer 1 espace et 1 seul devant le 1er §

le texte et la syntaxe sed imparfaite

 echo "colonne1   § colonne2   §   colonne3" | sed 's/ *§/-/1'

Si une bonne ame peut m'aider ... Merci

Si vous avez un lien vers un bon site ou tuto pour apprendre les syntaxe regex, je suis preneur.

Merci encore

Dernière modification par philoeil (Le 26/04/2020, à 07:39)

Hors ligne

#2 Le 25/04/2020, à 19:37

pingouinux

Re : [RESOLU] demande d'aide pour une expression regex

Bonsoir,
Est-ce ceci que tu veux ?

$ echo "colonne1   § colonne2   §   colonne3" | sed 's/ §/-/'
colonne1  - colonne2   §   colonne3

ou bien

$ sed 's/ §/-/' <<<"colonne1   § colonne2   §   colonne3"colonne1  - colonne2   §   colonne3"
colonne1  - colonne2   §   colonne3

Dernière modification par pingouinux (Le 25/04/2020, à 19:51)

Hors ligne

#3 Le 25/04/2020, à 19:44

kamaris

Re : [RESOLU] demande d'aide pour une expression regex

philoeil a écrit :

Si vous avez un lien vers un bon site ou tuto pour apprendre les syntaxe regex, je suis preneur.

https://fr.wikipedia.org/wiki/Expressio … es_de_base

Hors ligne

#4 Le 25/04/2020, à 19:51

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,

Merci Pingouinux

J'ai voulu faire simple dans ma demande mais cela ne marche pas, je complète :

dans le script suivant j'ai ceci

# suppression des espaces en debut de colonne
 Col2Space="$(echo "$colonne2" | sed -e "s/^ §*//")"
echo '$colonne2='"$colonne2""<<<<"
 echo '$Col2Space='"$Col2Space""<<<"
Col1Space="$(echo "$colonne1" | sed -e "s/ §//")"
 echo '$colonne1='"$colonne1""<<<<"
echo '$Col1Space='"$Col1Space""<<<<"
 anciennom="$RepDoublons$Col1Space/$Col2Space"

Le fichier source exemple ici :

Racine §  20200414LisezMoi_JournalSauvegarde.txt
Racine/Rep2doublons1Original §  FichTexte1.txt
Racine/Rep2sur2Doublon §  FichTexte1.txt
Racine/Rep2doublons1Original §  Fichiertxt2.txt
Racine/Rep2sur2Doublon §  Fichiertxt2.txt

Le resultat qui ne me convient pas (1 seule ligne copiée pour l'exemple) (J'ai un espace de trop apres Racine) :

Je vais déplacer   20200414LisezMoi_JournalSauvegarde.txt dans l'emplacement /home/phil/poubelle/Chemin
$colonne2=  20200414LisezMoi_JournalSauvegarde.txt<<<<
$Col2Space= 20200414LisezMoi_JournalSauvegarde.txt<<<
$colonne1=Racine <<<<
$Col1Space=Racine <<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine / 20200414LisezMoi_JournalSauvegarde.txt
nouveau nom complet:/home/phil/poubelle/Racine 
mv: impossible d'évaluer '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine / 20200414LisezMoi_JournalSauvegarde.txt': Aucun fichier ou dossier de ce type

Merci de ton aide

Hors ligne

#5 Le 25/04/2020, à 20:05

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,
Et Merci Kamaris pour le lien
je lis et continue de chercher

La difficulté que je rencontre est de rester concentré sur mon problème il y a tant d'information intéressante un peu partout que je m'éparpille et n'avance plus.

A +

Hors ligne

#6 Le 25/04/2020, à 20:08

pingouinux

Re : [RESOLU] demande d'aide pour une expression regex

Désolé, mais je n'ai rien compris…

Hors ligne

#7 Le 25/04/2020, à 20:14

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,

Je vais simplifier ma demande :
il me semble que tout mon problème vien dans mes script regex dans mes sed qui ne fonctionne pas

Si je parvenais à comprendre comment résoudre le cas suivant il me semble que je pourrais l'utiliser pour corriger mon script.

Dans le script suivant comment faire pour diminuer d'un point à gauche et à droite du symbole § ?

exemple de mon code erroné :

phil@phil-G750JH:~$ echo "colonne1.....§..colonne2   §   colonne3" |  sed -e "s/.§*//"
olonne1.....§..colonne2   §   colonne3
phil@phil-G750JH:~$

Merci

Hors ligne

#8 Le 25/04/2020, à 20:21

pingouinux

Re : [RESOLU] demande d'aide pour une expression regex

Ceci ?

$ sed -e "s/\.§\./§/" <<<"colonne1.....§..colonne2   §   colonne3"
colonne1....§.colonne2   §   colonne3

Hors ligne

#9 Le 25/04/2020, à 21:03

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,

Merci Pingouinux

phil@phil-G750JH:~$ echo "colonne1.....§..colonne2   §   colonne3" |  sed -e "s/\.§\./§/"
colonne1....§.colonne2   §   colonne3
phil@phil-G750JH:

Cela marche pour les points et la demande que je vous ai faite
et
Malheureusement j'echoue à le transposer pour la même chose avec des espaces à la place des points dans le script qui coince

Col2Space="$(echo "$colonne2" | sed -e "s/§ //")"
echo '$colonne2='"$colonne2""<<<<"
 echo '$Col2Space='"$Col2Space""<<<"
Col1Space="$(echo "$colonne1" | sed -e "s/ §//")"
 echo '$colonne1='"$colonne1""<<<<"
echo '$Col1Space='"$Col1Space""<<<<"

ce qui se traduit par l'absence de différence entre $colonne2 et $Col2Space
Le résultat attendu :

$colonne2=  20200414LisezMoi_JournalSauvegarde.txt<<<<
$Col2Space= 20200414LisezMoi_JournalSauvegarde.txt<<<
...
$colonne1=Racine <<<<
$Col1Space=Racine<<<<

Le resultat erroné j'ai des espaces de trop à gauche et à droite de $Col2Space et $Col1Space

Je vais déplacer   20200414LisezMoi_JournalSauvegarde.txt dans l'emplacement /home/phil/poubelle/Chemin
$colonne2=  20200414LisezMoi_JournalSauvegarde.txt<<<<
$Col2Space=  20200414LisezMoi_JournalSauvegarde.txt<<<
$colonne1=Racine <<<<
$Col1Space=Racine <<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine /  20200414LisezMoi_JournalSauvegarde.txt
nouveau nom complet:/home/phil/poubelle/Racine 
mv: impossible d'évaluer '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine /  20200414LisezMoi_JournalSauvegarde.txt': Aucun fichier ou dossier de ce type

Je cherche encore ...

Dernière modification par philoeil (Le 25/04/2020, à 21:13)

Hors ligne

#10 Le 25/04/2020, à 21:19

kamaris

Re : [RESOLU] demande d'aide pour une expression regex

Le problème, c'est que depuis le début, tu persistes à remplacer la première chaine de la commande s de sed par rien (ou par un tiret dont on ne sait pas trop d'où il vient ni quel est son sens), en mettant en plus des quantificateurs inutiles :

sed 's/ *§/-/1'
sed -e "s/^ §*//"

Regarde ce qu'a fait pingouinux : pour supprimer les points qui entourent le §, il remplace .§. par §, et non pas par rien :

sed -e "s/\.§\./§/"

Donc si tu veux, comme tu le dis dans ton premier message, « éliminer 1 espace et 1 seul devant le 1er § », il suffit de faire :

sed 's/ §/§/'

Appliqué à l'exemple de ton premier post :

$ echo "colonne1   § colonne2   §   colonne3" | sed 's/ §/§/'
colonne1  § colonne2   §   colonne3
$ 

Hors ligne

#11 Le 25/04/2020, à 21:33

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,
Merci Kamaris vous avez tous raison j'ai mal posé le problème en voulant simplifier ma question, et vos solutions résolve mes premières questions

J'ai cru que je serai à même de tansposer votre solution mais j'échoue lamentablement.

Si vous voulez bien regarder mon poste #9 il me semble que le problème est mieux exposé

Hors ligne

#12 Le 25/04/2020, à 21:50

pingouinux

Re : [RESOLU] demande d'aide pour une expression regex

Si vous voulez bien regarder mon poste #9 il me semble que le problème est mieux exposé

Je ne vois toujours pas où tu veux en venir…

Hors ligne

#13 Le 25/04/2020, à 22:11

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Merci Pingouinux

J'essaie de faire plus clair :

Malgres la correction apporter aux expressions regex des commandes sed suivantes les espaces ne disparaissent pas, quelle peut-être l'erreur ?
Le code

Col2Space="$(echo "$colonne2" | sed -e "s/§ //")"
echo '$colonne2='"$colonne2""<<<<"
 echo '$Col2Space='"$Col2Space""<<<"
Col1Space="$(echo "$colonne1" | sed -e "s/ §//")"
 echo '$colonne1='"$colonne1""<<<<"
echo '$Col1Space='"$Col1Space""<<<<"

Le resultat obtenu :

$colonne2= FichTexte1.txt<<<<
$Col2Space= FichTexte1.txt<<<
$colonne1=Racine/Rep2doublons1Original <<<<
$Col1Space=Racine/Rep2doublons1Original <<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2doublons1Original / FichTexte1.txt
nouveau nom complet:/home/phil/poubelle/Racine/Rep2doublons1Original 
mv: impossible d'évaluer '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2doublons1Original / FichTexte1.txt': Aucun fichier ou dossier de ce type

Le resultat attendu
$colonne2= FichTexte1.txt<<<<
$Col2Space=FichTexte1.txt<<<
$colonne1=Racine/Rep2doublons1Original <<<<
$Col1Space=Racine/Rep2doublons1Original<<<<

Le fichier source des données :

Racine/Rep2doublons1Original § FichTexte1.txt
Racine/Rep2sur2Doublon § FichTexte1.txt
Racine/Rep2doublons1Original § Fichiertxt2.txt
Racine/Rep2sur2Doublon § Fichiertxt2.txt

Merci bien

Hors ligne

#14 Le 25/04/2020, à 23:09

kamaris

Re : [RESOLU] demande d'aide pour une expression regex

Donc en gros, j'en déduis que tes variables colonne1 et colonne2 proviennent de

colonneN=$(awk -F'§' '{print $N}' fichier)

À partir de là, elles ne contiennent pas le caractère §, puisqu'il a servi de séparateur dans awk.
Donc sed ne risque pas de le trouver, et donc il ne remplacera rien.

Partant de tes variables colonne1 et colonne2, il faudrait faire

Col1Space=$(echo "$colonne1" | sed -e 's/ $//')
Col2Space=$(echo "$colonne2" | sed -e 's/^ //')

Mais, pourquoi appeler sed après awk ?
Pourquoi ne pas faire simplement :

colonneN=$(awk -F' § ' '{print $N}' fichier)

(je précise au cas où que le N est à remplacer par 1 ou 2, à gauche et à droite du signe =)

Hors ligne

#15 Le 26/04/2020, à 07:39

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,
Et grand grand merci Kamaris

J'ai 2 très bonnes nouvelles
Ta correction marche parfaitement ( elle me permet de résoudre un bug qui apparaissait quand mes chemins de repertoires et fichiers  contenaient des espaces):

Exemple resultat obtenu

Je vais déplacer  F2.CpBBID2_EspaceApresNef.nef  dans l'emplacement /home/phil/poubelle/Chemin
$colonne2= F2.CpBBID2_EspaceApresNef.nef <<<<
$Col2Space=F2.CpBBID2_EspaceApresNef.nef <<<
$colonne1=Racine <<<<
$Col1Space=Racine<<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/F2.CpBBID2_EspaceApresNef.nef 
nouveau nom complet:/home/phil/poubelle/Racine
renamed '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/F2.CpBBID2_EspaceApresNef.nef ' -> '/home/phil/poubelle/Racine/F2.CpBBID2_EspaceApresNef.nef '
Je vais déplacer  F2.2 CpBBID2_EspaceApresNef.nef  dans l'emplacement /home/phil/poubelle/Chemin
$colonne2= F2.2 CpBBID2_EspaceApresNef.nef <<<<
$Col2Space=F2.2 CpBBID2_EspaceApresNef.nef <<<
$colonne1=Racine/Rep2.2 Espace Doublons  <<<<
$Col1Space=Racine/Rep2.2 Espace Doublons <<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2.2 Espace Doublons /F2.2 CpBBID2_EspaceApresNef.nef 
nouveau nom complet:/home/phil/poubelle/Racine/Rep2.2 Espace Doublons 
 Absence de l'arborescence /home/phil/poubelle/Racine/Rep2.2 Espace Doublons  je la crée
mkdir: création du répertoire '/home/phil/poubelle/Racine/Rep2.2 Espace Doublons '
renamed '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2.2 Espace Doublons /F2.2 CpBBID2_EspaceApresNef.nef ' -> '/home/phil/poubelle/Racine/Rep2.2 Espace Doublons /F2.2 CpBBID2_EspaceApresNef.nef '

et j'ai terminé mon 1er projet shell (pour le moment plus de bug)

Kamaris a écrit :

Mais, pourquoi appeler sed après awk ?
Pourquoi ne pas faire simplement :

colonneN=$(awk -F' § ' '{print $N}' fichier)

Parceque c'est mon vrai premier code shell et que je fais plein de bêtises:
roll
Ta remarque est bonne et m'a fait voir une autre manière de résoudre mon problème

pour info ce n'était pas depuis une commande AWK mais depuis une boucle While

Mais c'est pareil (Il faut que j'essaie)

		while IFS='§' read -r colonne1 colonne2 ; do

à remplacer (tout simplement) par

		while IFS=' § ' read -r colonne1 colonne2 ; do

Merci pour vos aides
smile

Hors ligne

#16 Le 26/04/2020, à 08:08

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Bonjour,

Pour info j'ai essayé de modifier le code comme évoqué précédemment, mais cela ne marche pas (ce n'est donc pas pareil)

Mais c'est pareil (Il faut que j'essaie)

        while IFS='§' read -r colonne1 colonne2 ; do

à remplacer (tout simplement) par

        while IFS=' § ' read -r colonne1 colonne2 ; do

Resultat bizarre :
il apparait des caractères " ? dans un losange vertical (que je ne parviens pas a coller/afficher sur le forum)" et '$'\247'' qui n'apparaissent pas dans la première façon pour régler le problème

Je vais déplacer Espace Doublons  § F2.2 CpBBID2_EspaceApresNef.nef dans l'emplacement /home/phil/poubelle/Chemin
$colonne2=Espace Doublons  § F2.2 CpBBID2_EspaceApresNef.nef<<<<
$Col2Space=Espace Doublons  § F2.2 CpBBID2_EspaceApresNef.nef<<<<
$colonne1=Racine/Rep2.2<<<<
$Col1Space=Racine/Rep2.2<<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2.2/Espace Doublons  § F2.2 CpBBID2_EspaceApresNef.nef
nouveau nom complet:/home/phil/poubelle/Racine/Rep2.2
mv: impossible d'évaluer '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2.2/Espace Doublons  § F2.2 CpBBID2_EspaceApresNef.nef': Aucun fichier ou dossier de ce type
Je vais déplacer Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef dans l'emplacement /home/phil/poubelle/Chemin
$colonne2=Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef<<<<
$Col2Space=Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef<<<<
$colonne1=Racine/Rep2.2<<<<
$Col1Space=Racine/Rep2.2<<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2.2/Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef
nouveau nom complet:/home/phil/poubelle/Racine/Rep2.2
mv: impossible d'évaluer '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/Rep2.2/Espace Doublons /Rep2.2.2.1 Doss Espace § F2.2.2.1 CpBBID2_EspaceApresNef.nef': Aucun fichier ou dossier de ce type
Je vais déplacer  F2BBID1_1 espaceApresJpg.jpg dans l'emplacement /home/phil/poubelle/Chemin
$colonne2= F2BBID1_1 espaceApresJpg.jpg<<<<
$Col2Space= F2BBID1_1 espaceApresJpg.jpg<<<<
$colonne1=Racine<<<<
$Col1Space=Racine<<<<
info $anciennom=/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/ F2BBID1_1 espaceApresJpg.jpg
nouveau nom complet:/home/phil/poubelle/Racine
mv: impossible d'évaluer '/home/phil/Documents/JeCodeShell/ShellEssaiRepDblons/Racine/'$'\247'' F2BBID1_1 espaceApresJpg.jpg': Aucun fichier ou dossier de ce type

Le problème reste résolu, je m'arrete là il est temps que j'emploie mon code tout beau tout neuf

Merci

Hors ligne

#17 Le 26/04/2020, à 14:05

kamaris

Re : [RESOLU] demande d'aide pour une expression regex

Non, ça n'est pas pareil de faire IFS=' § ' read et awk -F' § '.
Dans le premier cas, chaque caractère de l'IFS servira de délimiteur, donc ici § et l'espace (qui figure deux fois).
Dans le second cas, c'est toute la chaine qui servira de délimiteur.
Ce qui serait équivalent à IFS=' § ' read, ce serait awk -F'[ § ]' (ou simplement awk -F'[ §]').

Hors ligne

#18 Le 26/04/2020, à 18:30

philoeil

Re : [RESOLU] demande d'aide pour une expression regex

Merci Kamaris des précisions toujours bien vues

Hors ligne