Traitement fichier avec SED avec parenthéses
Résolu/Fermé
pcsystemd
Messages postés
702
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 novembre 2024
-
17 juil. 2009 à 10:41
pcsystemd Messages postés 702 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 6 novembre 2024 - 23 juil. 2009 à 08:00
pcsystemd Messages postés 702 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 6 novembre 2024 - 23 juil. 2009 à 08:00
A voir également:
- Traitement fichier avec SED avec parenthéses
- Fichier rar - Guide
- Fichier host - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier iso - Guide
10 réponses
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 !
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 !
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
17 juil. 2009 à 14:09
17 juil. 2009 à 14:09
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')
$
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')
$
pcsystemd
Messages postés
702
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 novembre 2024
23
17 juil. 2009 à 14:51
17 juil. 2009 à 14:51
Merci a vous deux pour les infos.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
17 juil. 2009 à 16:14
17 juil. 2009 à 16:14
Salut,
sed ':z;N;$!bz;s/\n/'\',\''/g;s/.*/('\''&'\'')/';-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
pcsystemd
Messages postés
702
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 novembre 2024
23
21 juil. 2009 à 11:25
21 juil. 2009 à 11:25
Merci également jipicy pour la solution avec SED.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
21 juil. 2009 à 11:47
21 juil. 2009 à 11:47
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 ;-((
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 ;-((
pcsystemd
Messages postés
702
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 novembre 2024
23
21 juil. 2009 à 12:30
21 juil. 2009 à 12:30
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é.
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
21 juil. 2009 à 14:32
21 juil. 2009 à 14:32
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')
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
21 juil. 2009 à 14:39
21 juil. 2009 à 14:39
Ben voui, sans lui pas de "sed" ;-((
Merci ;-)
Merci ;-)
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 620
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
21 juil. 2009 à 15:20
21 juil. 2009 à 15:20
et bien pratique pour modifier des fichiers sans les copier ou les déplacer sur les Unixes sans sed -i
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
21 juil. 2009 à 15:56
21 juil. 2009 à 15:56
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" ;-(
pcsystemd
Messages postés
702
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 novembre 2024
23
22 juil. 2009 à 17:25
22 juil. 2009 à 17:25
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.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 juil. 2009 à 19:05
22 juil. 2009 à 19:05
Re-
Pour la commande "sed" :
: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 :
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 ;-))
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 ;-))
pcsystemd
Messages postés
702
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
6 novembre 2024
23
23 juil. 2009 à 08:00
23 juil. 2009 à 08:00
Merci pour les explications très détaillées. Maintenant il ne me reste plus qu'a digéré tout cela ;-).