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 27/09/2010, à 20:57

ehmicky

[Résolu]Problème de sed/awk

Salut à tous,
J'ai un fichier comme ça (l'indentation compte) :

   texte_texte texte_texte
texte 
   texte_quelconque_text texte_texte

Je voudrais que, sur chaque ligne, chaque caractère (imprimable ou non) qui précède la première occurence de  soit dupliqué, avec un \b au milieu. Ainsi ensuite, en pipant avec less, cela donnera tout caractère précédant un  en gras.
Par exemple, sur la première ligne, ça donnerait :

 \b  \b  \b t\bte\bex\bxt\bte\be_\b_t\bte\bex\bxt\bte\be \b texte_texte

Il me faudrait un code qui marche, parce que je ne trouve pas, y'a toujours quelque chose qui cloche !
Merci !

PS : Le problème, c'est que si :

sed 's/./&\\b&/g'

marche (en dehors du fait qu'il ne prend pas en compte le délimiteur ), cependant :

sed 's/\(.\)\(.*\)/\1\\b\1\2/g'

Ne remplace que la première occurence, et non toutes les occurences.

Dernière modification par ehmicky (Le 27/09/2010, à 22:26)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 27/09/2010, à 21:18

chopinhauer

Re : [Résolu]Problème de sed/awk

ehmicky a écrit :

Je voudrais que, sur chaque ligne, chaque caractère (imprimable ou non) qui précède la première occurence de  soit dupliqué, avec un \b au milieu. Ainsi ensuite, en pipant avec less, cela donnera tout caractère précédant un  en gras.

Le overstrike lettre + backspace + lettre n'est pas l'unique manière pour faire du gras. Dans les terminal il y a aussi la séquence ANSI: '\e[0m' pour le mode normal, '\e[1m' pour le gras, '\e[4m' pour le sous-ligné… Pour l'aspect graphique c'est toujours '\e[<nombres>m'. Tu peux regarder les autres sur Wikipedia ou sur Invisible Island.

PS: '\e' est le caractère escape (^[ ou 0x1b). À la place de '\e[' tu peux aussi utiliser CSI: 0x9b ou 0233.

Dernière modification par chopinhauer (Le 27/09/2010, à 21:29)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#3 Le 27/09/2010, à 21:23

ehmicky

Re : [Résolu]Problème de sed/awk

Merci, je vais regarder si ça me permet de simplifier mon problème.
Pour le problème en lui-même, j'ai en fait trouver une solution. Je la poste.

La voici :

#!/bin/bash 

while IFS="" read ligne ; do
	echo "$(sed 's/./&\\b&/g' <<<${ligne%%*})${ligne#*}"
done <"$1"

Ouh là, là ça pas l'air de marcher en fait, je vais regarder ça.

Edit : attends, je teste ton code, mais je crois qu'il va peut-être y avoir le même problème que j'avais eu.
Edit2 : Ah non ! Effectivement, ça devrait résoudre le problème, parce que ça prend tout \(.*\) d'un coup. Le problème en fait, c'était que sed ne remplaçait que la première occurence, mais là avec \e[1m...\e[0m ça devrait résoudre le problème, je regarde.
Edit3 : ouh là, il a plein de problèmes le code ci-dessus, il est vraiment mauvais, ta solution devrait être ok

Dernière modification par ehmicky (Le 27/09/2010, à 21:36)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#4 Le 27/09/2010, à 21:29

chopinhauer

Re : [Résolu]Problème de sed/awk

En gros

sed 's/^\(.*\)/\x1b[1m\1\x1b0m/g'

devrait marcher. Sans oublier l'option '-R' (ou '-r') à less.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#5 Le 27/09/2010, à 21:37

ehmicky

Re : [Résolu]Problème de sed/awk

Alors je vais voir ça.
Par contre, je vais devoir mettre deux backlashs avant e[1m sûrement

Ok, donc avec ça, ça marche :

sed 's/^\([^]*\)/\\e[1m\1\\e[0m/g'

Dernière modification par ehmicky (Le 27/09/2010, à 21:41)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#6 Le 27/09/2010, à 21:39

Postmortem

Re : [Résolu]Problème de sed/awk

En repartant de ton essai plus haut :

#!/bin/bash 

while read
do
    echo "$(sed 's/./&\\b&/g' <<<${REPLY%%*})${REPLY#*}"
done <"$1"

Dernière modification par Postmortem (Le 27/09/2010, à 21:40)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#7 Le 27/09/2010, à 21:44

ehmicky

Re : [Résolu]Problème de sed/awk

Postmortem a écrit :

En repartant de ton essai plus haut :

#!/bin/bash 

while read
do
    echo "$(sed 's/./&\\b&/g' <<<${REPLY%%*})${REPLY#*}"
done <"$1"

Non justement, le truc c'est que j'avais un problème avec la boucle read, parce que read supprimait les indentations des lignes qu'il lisait, c'est pour ça que j'ai mis IFS="". Sinon la variable par défaut REPLY ou ma variable "ligne", ça donnait le même résultat.

En fait, ça a l'air con comme ça, mais le truc c'est que même avec le flag "/g", sed ne faisait son action que sur la première occurence, mais je savais pas comment faire pour qu'il fasse son action à nouveau sans passer par une boucle. Alors je me suis dit "boucle while read", mais j'ai vu que read en fait supprimait les indentations. Mais là avec la solution de chopinhauer, je traite tout le morceau d'un coup, donc ça devrait coller.

Dernière modification par ehmicky (Le 27/09/2010, à 21:48)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#8 Le 27/09/2010, à 21:45

Postmortem

Re : [Résolu]Problème de sed/awk

Le read sans mettre de nom de variable derrière (donc ça initialise la variable REPLY) permet d'éviter cette perte de formatage
En tout cas, je viens d'essayer ton exemple chez moi et ça marche

Dernière modification par Postmortem (Le 27/09/2010, à 21:46)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#9 Le 27/09/2010, à 21:48

chopinhauer

Re : [Résolu]Problème de sed/awk

Vu que ta question portait aussi sur Awk l'éternel oublié, voilà la solution avec cet outil:

awk 'BEGIN{FS=OFS=""} {gsub(/./,"&\b&",$1); print $0}'

PS: Ceci dit awk et sed posent un peu de problèmes avec UTF-8. Cette commande va couper les séquences UTF-8 en petits morceaux.

Dernière modification par chopinhauer (Le 27/09/2010, à 21:57)


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#10 Le 27/09/2010, à 21:48

ehmicky

Re : [Résolu]Problème de sed/awk

Ok ! Désolé, j'ignorais ça, c'est cool, je vais regarder.
Non, ça marche pas en fait pour le fait que REPLY permette de garder le formatage :

while read REPLY ; do
    echo "$REPLY"
done <<<"  essai"

Résultat :

essai

Et avec :

while IFS="" read REPLY ; do
    echo "$REPLY"
done <<<"  essai"

Ca donne :

   essai

Dernière modification par ehmicky (Le 27/09/2010, à 21:53)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#11 Le 27/09/2010, à 21:49

Postmortem

Re : [Résolu]Problème de sed/awk

Oups, dans un script ça ne marche pas mais en direct dans le terminal, ça fonctionne !
Désolé !

while read
do
    echo "$(sed 's/./&\\b&/g' <<<${REPLY%%*})${REPLY#*}"
done < test.txt

Dernière modification par Postmortem (Le 27/09/2010, à 21:51)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#12 Le 27/09/2010, à 21:55

ehmicky

Re : [Résolu]Problème de sed/awk

Oui, t'as raison en shell interactif, y'a cette différence en fait. J'ai du mal à discerner pourquoi, mais c'est le cas !
Bon, je vais retourner au problème, et finir cette question ! big_smile

Dernière modification par ehmicky (Le 27/09/2010, à 21:55)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#13 Le 27/09/2010, à 22:04

Totor

Re : [Résolu]Problème de sed/awk

@ehmicky : oui effectivement. le truc avec les variables "ligne" et "REPLY" je l'ai répété à plusieurs reprises (mais cela ne doit pas faire suffisamment de temps que tu es régulier pour l'avoir lu !

@Postmortem : ce n'est pas le fait d'être en console ou en script qui fait qu'il y a perte de formatage. C'est que tu ne protèges pas l'expansion de paramètre ${REPLY%%*} lorsque tu la passes à sed :

#!/bin/bash
while read
do
    echo "$(sed 's/./&\\b&/g' <<<"${REPLY%%*}")${REPLY#*}"
done < "$1"

Dernière modification par Totor (Le 27/09/2010, à 22:06)


-- Lucid Lynx --

Hors ligne

#14 Le 27/09/2010, à 22:09

ehmicky

Re : [Résolu]Problème de sed/awk

Ok, code final, marche impèc' !

while read ; do
    sed 's/^\([^]*\)/\x1b[1m\1\x1b[0m/g' <<<"$REPLY"
done <"$1" | less -r

Merci beaucoup ! big_smile

@Totor : oui ça doit être ça

Dernière modification par ehmicky (Le 27/09/2010, à 22:10)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#15 Le 27/09/2010, à 22:20

Postmortem

Re : [Résolu]Problème de sed/awk

Oups, j'ai du perdre ou rajouter des " lors de mes essais...
Merci pour les sed et autres awk vu sur ce fil qui m'ont fait m'entrainer en tout cas ! tongue


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#16 Le 27/09/2010, à 22:26

ehmicky

Re : [Résolu]Problème de sed/awk

En tout cas, ça carbure ici, pas de problème insolvable ! big_smile


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#17 Le 27/09/2010, à 23:01

chopinhauer

Re : [Résolu]Problème de sed/awk

Après quelque test, il me semble que sed et awk se comportent bien tous les deux dans un environnement UTF-8. L'expression '.' trouve bien les codepoint Unicode et pas les simples octets qui le composent.

Si quelqu'un a de la documentation à l'égard, je suis preneur.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#18 Le 27/09/2010, à 23:51

ehmicky

Re : [Résolu]Problème de sed/awk

Sans doc' :

sed 's/o.o/oo/g' <<<"oo"

me semble indiquer que sed est compatible UTF-8.
Par contre, par exemple :

awk 'BEGIN { FIELDWIDTHS="1 1 1" } { print $3 }' <<<"oo"

me semble renvoyer un résultat indiquant que ce n'est pas le cas.
A vérifier big_smile

Edit : autre test dans ce sens :

awk '{ printf "%.5s\n", $1 }' <<<"1345"

PS : décidément on l'aura bien mis à contribuer le smiley , je comprends qu'il fasse la gueule big_smile

Dernière modification par ehmicky (Le 27/09/2010, à 23:56)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#19 Le 28/09/2010, à 00:42

chopinhauer

Re : [Résolu]Problème de sed/awk

C'est juste le code qui compte le caractères qui ne supporte pas UTF-8, un simple:

awk '{sub(/o.o/,"oo");print}' <<<"oo"

marche comme prévu.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#20 Le 28/09/2010, à 00:53

ehmicky

Re : [Résolu]Problème de sed/awk

Je sais pas si ça se tient, mais je demande si c'est pas parce que gawk fait appel aux fonctions de globbing de glibc, et en interne, il a aussi des fonctions qui marchent pas en multi-octets.
Je dis ça, j'en ai aucune idée, je dis juste ça au cas où, je sais pas


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#21 Le 28/09/2010, à 01:17

chopinhauer

Re : [Résolu]Problème de sed/awk

Les deux n'ont pas d'autres dépendances que glibc, donc j'imagine qu'ils utilisent les regexp POSIX de la librairie. Le problème de FIELDWIDTHS est bien connu, par contre printf ne se comporte pas comme la fonction de C:

awk '{ printf "%.5ls", $1 }' <<<"" | wc -c

donne 5, tandis qu'il n'est pas censé couper un caractère à moitié.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#22 Le 28/09/2010, à 02:02

ehmicky

Re : [Résolu]Problème de sed/awk

Hey, t'as ramené toute la tribu de smiley big_smile !

Oui, regexp, pas globbing ! yikes et puis avec %s et non %ls, ça pouvait pas marcher de toute façon

Sinon, pour en être sûr... sources

Bon je rigole, mais en attendant, il y a des "regex.h" et "regex_international.h", donc bon ça a bien l'air d'être le cas ! Maintenant, je me sens pas prêt à aller là-dedans ! big_smile

Dernière modification par ehmicky (Le 28/09/2010, à 02:04)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#23 Le 28/09/2010, à 02:54

chopinhauer

Re : [Résolu]Problème de sed/awk

Donc apparemment gawk utilise son propre printf qui ignore l'option l (selon la norme POSIX). FIELDWIDTHS est un extension gawk qui utilise encore les octets, par contre length donne la longueur exacte.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#24 Le 28/09/2010, à 04:54

ehmicky

Re : [Résolu]Problème de sed/awk

Si tu veux vraiment savoir, tu peux demander à comp.lang.awk, y'a des psychopathes du awk là-bas... Ils te sortent des lignes à te retourner le ciboulot big_smile
Je pense qu'ils peuvent te décrire l'évolution de la prise en charge d'Unicode par gawk, release par release, depuis 10 ans wink

Dernière modification par ehmicky (Le 28/09/2010, à 04:56)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne