#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
Si vous avez un lien vers un bon site ou tuto pour apprendre les syntaxe regex, je suis preneur.
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)
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:
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
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