Rechercher : dans
Par :

Traitement fichier avec SED avec parenthéses

Dernière réponse le 23 jui 2009 à 08:00:55 pcsystemd, le 17 jui 2009 à 10:41:47 
 Signaler ce message aux modérateurs

Bonjour,

j'ai besoin de traiter un fichier contenant ce qui suit ;

hdfhdfh
ghhgyut
iyuiyuiuyi
zeaeaz
hgdudod

afin d'avoir en sortie :
('hdfhdfh','ghhgyut','iyuiyuiuyi','zeaeaz','hgdudod')

J'ai testé plusieurs truc avec SED mais rien qui fonctionne.

Une idée a me donner?


Merci L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Configuration: Linux
Mozilla 1.9.0.11

Meilleures réponses pour « Traitement fichier avec SED avec parenthéses » dans :
Sed - Supprimer une ou plusieurs lignes d'un fichier Voir Supprimer une (ou plusieurs) ligne(s) d'un fichier Syntaxe sed '{[/]||[/]}d' sed '{[/][,][/]d' /.../ = délimiteurs n = le numéro de ligne chaîne = la chaîne contenue dans la...
Sed - Introduction à SED - Part II VoirSED - The Stream EDitor - Part II Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Sed - Substitution VoirSubstitution Substitution basique Simple Globale Ciblée Substitution conditionnée Simplee Avancée Bloc Avancéé Substitution basique Simple - 1ère occurrence (de chaque ligne) rencontrée uniquement sed 's/la/LA/' fichier.txt
Sed - Numérotation de lignes VoirNumérotation * Numéroter les lignes (équivalent à "cat -n fichier.txt") sed = fichier.txt L'inconvénient c'est que l'affichage se fait sur 2 lignes. Donc pour palier à ce petit "défaut" sed = fichier.txt | sed 'N;s/\n/\t/' Numéroter les...
Fichier EPS VoirFormat EPS Un fichier EPS (Encapsulated PostScript) est un fichier PostScript encapsulé, c'est-à-dire un fichier PostScript prévu pour pouvoir être incorporé dans un autre fichier. Comment lire un fichier EPS ? Pour ouvrir un tel fichier, il...
Fichier RTF VoirFormat RTF Un fichier RTF est un fichier de traitement de texte au format standard Rich Text Format. L'intéret du format RTF est de pouvoir être lu par la quasi-totalité des applications de bureautique et sur tous les systèmes d'exploitation...
Fichier DOC VoirFormat DOC Un fichier DOC est un fichier de traitement de texte de la suite bureautique Microsoft Office. Comment lire un fichier DOC ? Il peut néanmoins être ouvert avec Word Viewer ou avec la suite gratuite et libre OpenOffice.org. OpenOffice...

1

sluthole, le 17 jui 2009 à 12:58:37

Bonjour,

Il y a surement mieux, mais tu peux faire celà avec une simple boucle for sur un cat.
Dans ce genre là (j'ai pas fait attention à la syntaxe) :

for ligne in `cat /ton/fichier.txt`; do
if [ $chaine = "" ]; then
chaine= "($ligne"
else
chaine= "$chaine,$ligne"
fi
done
chaine="$chaine)"

Si il y a des espaces dans les lignes de ton fichier, il faudra modifier le field separator (qui prend l'espace par défaut) avec IFS="\r\n" avant la boucle.

En espèrant t'avoir aidé,
Bonne journée !

Répondre à sluthole

2

dubcek, le 17 jui 2009 à 14:09:35

Hello
avec awk
$ cat a1
hdfhdfh
ghhgyut
iyuiyuiuyi
zeaeaz
hgdudod
$ awk 'BEGIN{s="("};{s=s ",\x27" $0 "\x27"};END{sub(",","",s);print s ")"}' < a1
('hdfhdfh','ghhgyut','iyuiyuiuyi','zeaeaz','hgdudod')
$

Répondre à dubcek

3

pcsystemd, le 17 jui 2009 à 14:51:35

Merci a vous deux pour les infos. L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd

4

jipicy, le 17 jui 2009 à 16:14:44

Salut,

sed ':z;N;$!bz;s/\n/'\',\''/g;s/.*/('\''&'\'')/'
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

5

pcsystemd, le 21 jui 2009 à 11:25:53

Merci également jipicy pour la solution avec SED. L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd

6

jipicy, le 21 jui 2009 à 11:47:00

De rien ;-))

J'avoue que j'y ai passé du temps à cause des quotes simples ;-((

Dans ce cas on ne peut pas utiliser les quotes doubles à cause de la négation dans l'expression (!) qui est alors interprétée par le shell ;-((
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

7

pcsystemd, le 21 jui 2009 à 12:30:53

Bin effectivement je trouvé la commande complexe et pour te dire la vérité, il faudra que je l'étudie d'un peu plus près car j'ai pas tout saisie. En tout cas merci pour le temps que tu as consacré. L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd

8

dubcek, le 21 jui 2009 à 14:32:45

N'oublions pas l'éditeur ed

$ cat a2
hdfhdfh
ghhgyut
iyuiyuiuyi
zeaeaz
hgdudod

$ cat ed1
1,$s/.*/'&'/
1,$-1s/$/,/
1s/^/(/
$s/$/)/
1,$j
w
q

$ cat ed1 | ed -s a2
$ cat a2
('hdfhdfh','ghhgyut','iyuiyuiuyi','zeaeaz','hgdudod')

Répondre à dubcek

9

jipicy, le 21 jui 2009 à 14:39:24

Ben voui, sans lui pas de "sed" ;-((

Merci ;-) $ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

10

dubcek, le 21 jui 2009 à 15:20:10

Et bien pratique pour modifier des fichiers sans les copier ou les déplacer sur les Unixes sans sed -i

Répondre à dubcek

11

jipicy, le 21 jui 2009 à 15:56:09

De plus il y a quelques fonctionnalités tel que "move, copy, join" qui sont bien utiles et c'est bien dommage qu'elles n'aient pas été implémentées dans "sed" ;-(
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

12

pcsystemd, le 22 jui 2009 à 17:25:47

Merci a vous deux. Ouai bin il va falloir que je décortiques tous cela car a l'heure ou j'écris ce post c'est encore un peu du chinois mais bon je commence a comprendre. L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd

13

jipicy, le 22 jui 2009 à 19:05:21

Re-

Pour la commande "sed" :

sed ':z;N;$!bz;s/\n/'\',\''/g;s/.*/('\''&'\'')/'

:z
On pose une étiquette


N
On ajoute la ligne suivante à l'espace de travail


$ !b z
Tant que la dernière ligne n'est pas atteinte, on se branche à l'étiquette.


s/\n/'\',\''/g
Quand la dernière ligne est lue. A ce moment là l'espace de travail ressemble à :
hdfhdfh\nghhgyut\niyuiyuiuyi\nzeaeaz\nhgdudod$
on substitue chaque fin de ligne par une virgule.



s/.*/('\'&\'')/
Puis on substitue tout ce qui se trouve dans l'espace de travail par lui même
entourée de parenthèses et de quotes simples



Pour l'histoire des quotes simples dans "s/\n/'\',\''/g" et "s/.*/('\'&\'')/". En fait les commandes du programme de sed sont protégées par des quotes simples, donc la 1ère quote de "s/\n/'\',\''/g" termine la protection de la 1ère partie du programme, donc là on se retrouve à nouveau dans le shell, on protège donc les quotes à insérer et pour retourner dans le programme de sed, on reouvre se qui sera la prochaine partie du programme. Et on recommence la même moulinette pour "s/.*/('\'&\'')/".

C'est peut être pas très clair, mais bon ce n'est pas évident à expliquer, encore moins à comprendre je me doute, mais une fois qu'on à piger le truc, ça coule de source ;-))


Pour la commande "ed", qui pourrait aussi se traduire sur une seule ligne par :
ed -s fichier <<<$',s/.*/\'&\'/\n1,$-1s/$/,/\n1s/^/\(/\n$s/$/\)/\n1,$j\nw'


A la différence de sed, ed n'a qu'une mémoire tampon, dans laquelle il stocke l'intégralité du fichier à traiter. Les changements se font dans cette mémoire tampon. Par défaut la ligne d'édition courante est la dernière ligne du fichier.


1,$ s/.*/'&'/
De la 1ère ligne à la dernière ($), on substitue chaque ligne par elle même encadrée par
des quotes simples



1,$-1s/$/,/
De la 1ère ligne à l'avant dernière ($-1), on substitue chaque fin de ligne ($) par une virgule


1s/^/(/
On ajoute une parenthèse ouvrante au début de la 1ère ligne


$s/$/)/
On ajoute une parenthèse fermante à la fin de la dernière ligne


1,$j
De la 1ère ligne à la dernière on jointe chaque ligne


w
On écrit le résultat dans le fichier


q
On quitte


Bon appétit ;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

14

 pcsystemd, le 23 jui 2009 à 08:00:55

Merci pour les explications très détaillées. Maintenant il ne me reste plus qu'a digéré tout cela ;-). L'accès au savoir est la première liberté que chaque homme d­evrait avoir.

Répondre à pcsystemd