#1 Le 16/08/2009, à 17:13
- Jean-paul 3
Modification de fichier texte en ligne de commande
Bonjour,
j'espère poster dans le bon forum !
je dois modifier une grosse série de fichiers texte au format RTF qui se présente de cette façon
A;titre1;texte court1.
- descriptif blabla.
- descriptif blabla.
- descriptif blabla.
B;titre2;texte court2.
- descriptif blabla.
- descriptif blabla.
- descriptif blabla.
etc....
et j'aimerai
premièrement passer en ligne de commande ces fichiers textes qui sont au format RTF en .txt
et ensuite pouvoir récupérer ces fichiers sous cette forme :
a;titre1;texte court1.- descriptif blabla.- descriptif blabla.- descriptif blabla.
b;titre2;texte court2- descriptif blabla.- descriptif blabla.- descriptif blabla.
etc...
concernant la conversion du Rich Text vers le .txt je pensais trouver un utilitaire en ligne de commande style rtftotxt, mais je ne trouve jusqu'à présent rien.
Ensuite concernant les retour chariot, j'ai bien trouvé la commande
tr -d '\r\n' < fichier1.txt > fichier2.txt
mais celle-ci m'élimine (logique) tous les retours chariots !
Existe t-il une commande afin de rendre cette suppression sélective !
D'avance merci
Dernière modification par Jean-paul 3 (Le 16/08/2009, à 17:14)
Hors ligne
#2 Le 16/08/2009, à 19:31
- chaoswizard
Re : Modification de fichier texte en ligne de commande
Pour ce qui est des fichiers textes, tu peux utiliser ce script sed :
#n
/^[A-Z]\+/ { # Si la ligne commence par une ou des lettres majuscules
1{ # Si c'est la 1ere ligne
h
d
}
1!{ # Si ce n'est pas la 1ere ligne
x
s/\n//g # On enleve les sauts de ligne
p
}
}
/^-/ { # Si la ligne commence par un tiret
$!{ # Si ce n'est pas la derniere ligne
H
d
}
${ # Si c'est la derniere ligne
H
x
s/\n//g # On enleve les sauts de ligne
p
}
}
Avec un petit
sed -f script.sed fichier.txt > sortie.txt
tu as ce qu'il te faut !!!
Dernière modification par chaoswizard (Le 16/08/2009, à 19:34)
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#3 Le 16/08/2009, à 20:27
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
Merci chaoswizard,
je teste demain (malheureusement impossible ce soir !) et je poste le résultat.
de n'importe quelle façon, merci de t-y être intéressé.
je sais que je devrais m'intéresser de près à Sed & Awk, malheureusement le bouquin de O'reilly en francais est épuisé
Hors ligne
#4 Le 17/08/2009, à 01:52
- olaf.10
Re : Modification de fichier texte en ligne de commande
Salut,
Je ne sais pas si tes blocs de texte font tous 4 lignes, mais si c'est le cas, ceci peut faire l'affaire :
grep '.' fichier1.txt | sed -e 's/$/ /' -e '$!N;s/\n/ /' -e '$!N;s/\n/ /' -e '$!N;s/\n/ /' > fichier2.txt
Hors ligne
#5 Le 17/08/2009, à 12:25
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
merci de vous intéresser à mon "petit" souci
chaoswizard : ton script fonctionne correctement "sauf" qu'il omet le premier retour chariot, par exemple ici après "texte court2."
B;titre2;texte court2. (manque la suppression du retour ici)
- descriptif blabla.
- descriptif blabla.
- descriptif blabla.
Olaf Grossebaf : malheureusement non, les blocs textes ne font pas toujours 4 lignes et effectivement j'ai testé ton script et à partir d'un moment le découpage ne se fait plus au bon endroit
Hors ligne
#6 Le 17/08/2009, à 12:53
- chaoswizard
Re : Modification de fichier texte en ligne de commande
merci de vous intéresser à mon "petit" souci
chaoswizard : ton script fonctionne correctement "sauf" qu'il omet le premier retour chariot, par exemple ici après "texte court2."B;titre2;texte court2. (manque la suppression du retour ici)
- descriptif blabla.
- descriptif blabla.
- descriptif blabla.
Heu moi, avec ça dans fichier.txt :
A;titre1;texte court1.
- descriptif blabla.
- descriptif blabla.
- descriptif blabla.
B;titre2;texte court2.
- descriptif blabla.
- descriptif blabla.
- descriptif blabla.
j'obtiens ça dans sortie.txt :
A;titre1;texte court1.- descriptif blabla.- descriptif blabla.- descriptif blabla.
B;titre2;texte court2.- descriptif blabla.- descriptif blabla.- descriptif blabla.
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#7 Le 17/08/2009, à 16:30
- olaf.10
Re : Modification de fichier texte en ligne de commande
Deux autres possibilités :
paste -s --delimiters=" " fichier1.txt | sed -e 's/ /\n/g' > fichier2.txt
sed 's/$/ /' fichier1.txt | paste -s --delimiters=" " | sed 's/ /\n/g' > fichier2.txt
Chez moi ça marche nickel.
Hors ligne
#8 Le 17/08/2009, à 21:55
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
décidement, effectivement vos scripts fonctionnent sur l'exemple que j'ai posté et pourtant ... dans la vraie vie, j'ai toujours ce put*** de retour chariot au bourt de la première ligne
voici donc un exemple "vrai", si cela marche chez vous j'y comprends rien !
merci pour votre patience
A;Halssnoer met ruit.;
Een halssnoer om de mooie harmonie van kleuren van uw outfit extra te onderlijnen! Ontdek hoe dit kleine detail een onweerstaanbare troef wordt ! Ruitvormige hanger aan ketting. Musketonslotje.
- Lengte 65 cm + verstelkettinkje van 6 cm.
- 100% metaal.
- 1 jaar waarborg.;
B;BLOES-TRUI.;
Trui met V-hals met bloeseffect, zichtbaar aan de hals, de polsen en aan de afgeronde onderkant, met comfortabel ruimtesplit voor.
- Ca. 72 tot 78 cm volgens de maat.
- Trui in 100% acryl. Loze bloes in 100% katoen.
- 1 jaar waarborg.;
Hors ligne
#9 Le 17/08/2009, à 22:48
- chaoswizard
Re : Modification de fichier texte en ligne de commande
Normal que ça ne marchait pas...
C'était pas faire pour ce texte là...
Voilà le nouveau qui devrait mieux aller :
#n
/^[A-Z];/ { # Si la ligne commence par une lettre majuscule puis un point virgule
1{ # Si c'est la 1ere ligne
h
d
}
1!{ # Si ce n'est pas la 1ere ligne
x
s/\n//g # On enleve les sauts de ligne
p
}
}
/^[A-Z];/! { # Si la ligne ne commence pas par une lettre majuscule puis un point virgule
$!{ # Si ce n'est pas la derniere ligne
H
d
}
${ # Si c'est la derniere ligne
H
x
s/\n//g # On enleve les sauts de ligne
p
}
}
Il renvoit :
A;Halssnoer met ruit.;Een halssnoer om de mooie harmonie van kleuren van uw outfit extra te onderlijnen! Ontdek hoe dit kleine detail een onweerstaanbare troef wordt ! Ruitvormige hanger aan ketting. Musketonslotje.- Lengte 65 cm + verstelkettinkje van 6 cm.- 100% metaal.- 1 jaar waarborg.;
B;BLOES-TRUI.;Trui met V-hals met bloeseffect, zichtbaar aan de hals, de polsen en aan de afgeronde onderkant, met comfortabel ruimtesplit voor.- Ca. 72 tot 78 cm volgens de maat.- Trui in 100% acryl. Loze bloes in 100% katoen.- 1 jaar waarborg.;
J'aimerais juste quelques précisions pour encore améliorer les choses :
- Le résultat que j'ai mis au dessus est bien le bon ?
- Tu as :
A;Halssnoer met ruit.;
B;BLOES-TRUI.;
...
Que ce passe t-il une fois arrivé à Z ?
Dernière modification par chaoswizard (Le 18/08/2009, à 21:53)
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#10 Le 18/08/2009, à 21:37
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
Salut chaoswizard,
effectivement cela fonctionne maintenant, merci
Désolé si j'ai mal dirigé au début je n'y ai d'abord pas vu de différence :=)
Je ne voudrais également pas abuser de ta bonne volonté, j'ai encore 2 modifs dans les cartons au niveau de ce type de fichier (c'est dans un but semi-profesionnel).
Si tu es d'accord fais-le moi savoir, sinon un grand merci pour ta collaboration.
Je suis réellement et sincèrement impressionné par les personnes qui manipulent/maitrisent le texte par l'intermédiaire de la ligne de commande .
J'associe cela à une forme d'art !
ps : je dois travailler de la sorte sur quelques centaines de fichiers qui ne dépassent la lettre P par fichier
Dernière modification par Jean-paul 3 (Le 18/08/2009, à 21:37)
Hors ligne
#11 Le 18/08/2009, à 21:51
- chaoswizard
Re : Modification de fichier texte en ligne de commande
Si ça ne dépasse pas la lettre P, ça devrait aller (j'ai quand même faire une modif sur le script juste avant) !
Sinon, pour tes 2 autres trucs, postes ça là : mets un exemple et ce que tu veux à la fin.
Il y aura bien quelqu'un pour te faire ça !
Dernière modification par chaoswizard (Le 18/08/2009, à 21:53)
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#12 Le 19/08/2009, à 12:01
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
Ok, mais sincèrement j'aime pas avoir l'air d'abuser
alors voilà pour que le traitement sur ces fichiers texte aille à son terme, je dois ensuite passer le titre en "première lettre en majuscule, le reste en minuscule".
Comme par l'exemple
B;BLOES-TRUI.;Trui met V-hals met bloeseffect, zichtbaar aan de hals, de polsen en aan de afgeronde onderkant, met comfortabel ruimtesplit voor.- Ca. 72 tot 78 cm volgens de maat.- Trui in 100% acryl. Loze bloes in 100% katoen.- 1 jaar waarborg.;
le titre est "BLOES-TRUI." il vient toujours au même endroit après la lettre en début de ligne et le point virgule. Donc la majuscule est toujours en 3 ième position. Par contre la longueur du titre à passer en minuscule donc varie mais se termine toujours par le prochain point et point virgule (.;).
voilà donc pour la 2 ième manip sur ces textes
la troisème et, je pense plus simple. Peut-être pourrat-on voir ensuite !
et ensuite ensuite, et bien j'en aurai terminé avec cette "exercice" et je ne t'ennuierai plus
De n'importe quelle facon, merci.
ps : si cela fonctionne, peut-on regrouper dans un seul script ?
Hors ligne
#13 Le 19/08/2009, à 14:49
- chaoswizard
Re : Modification de fichier texte en ligne de commande
On peut faire un script qui a partir du fichier précédent (sortie.txt) transforme les titres :
#!/bin/bash
IFS=$'\n'
for LIGNE in `cat sortie.txt`
do
TITRE=`echo "$LIGNE" | cut -d ";" -f 2 | tr 'A-Z' 'a-z' | sed 's/./\U&/'`
LIGNE=`echo "$LIGNE" | sed "s/;[^;]\{1,\};/;"$TITRE";/"`
echo "$LIGNE" >> sortie2.txt
done
Ce qui au final donne ça (sortie2.txt) :
A;Halssnoer met ruit.;Een halssnoer om de mooie harmonie van kleuren van uw outfit extra te onderlijnen! Ontdek hoe dit kleine detail een onweerstaanbare troef wordt ! Ruitvormige hanger aan ketting. Musketonslotje.- Lengte 65 cm + verstelkettinkje van 6 cm.- 100% metaal.- 1 jaar waarborg.;
B;Bloes-trui.;Trui met V-hals met bloeseffect, zichtbaar aan de hals, de polsen en aan de afgeronde onderkant, met comfortabel ruimtesplit voor.- Ca. 72 tot 78 cm volgens de maat.- Trui in 100% acryl. Loze bloes in 100% katoen.- 1 jaar waarborg.;
Dernière modification par chaoswizard (Le 19/08/2009, à 14:50)
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#14 Le 19/08/2009, à 21:18
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
merci chaoswizard, cela fonctionne !
dernier traitement (si,si !) sur ces fichiers, les textes "- decripitif blabla" doivent passer en
"<br>- descriptif bla bla.<br>- descriptif blabla
je m'explique , par exemple pour A :
A;Halssnoer met ruit.;Een halssnoer om de mooie harmonie van kleuren van uw outfit extra te onderlijnen! Ontdek hoe dit kleine detail een onweerstaanbare troef wordt ! Ruitvormige hanger aan ketting. Musketonslotje.- Lengte 65 cm + verstelkettinkje van 6 cm.- 100% metaal.- 1 jaar waarborg.;
je dois pouvoir retrouver :
A;Halssnoer met ruit.;Een halssnoer om de mooie harmonie van kleuren van uw outfit extra te onderlijnen! Ontdek hoe dit kleine detail een onweerstaanbare troef wordt ! Ruitvormige hanger aan ketting. Musketonslotje.<br>- Lengte 65 cm + verstelkettinkje van 6 cm.<br>- 100% metaal.<br>- 1 jaar waarborg.;
en fait, je pars de texte extrait d'un catalogue papier et modifié (ce que tu as fait jusqu'a présent) afin d'être incorporé dans un site web.
si tu le souhaites je pourrais te donner de plus amples explications. Je te remercie pour ton aide et aimerai te contacter ensuite car tu me dépanne réellement, sauf si cela te déranges, mais je t'en reparle par la suite
Hors ligne
#15 Le 19/08/2009, à 22:24
- chaoswizard
Re : Modification de fichier texte en ligne de commande
Pour le coup du <br>, j'ai ajouté ça au script sed et j'ai réussi aussi à mettre le coup du titre en majucule :
#n
/^[A-Z];/ { # Si la ligne commence par une lettre majuscule puis un point virgule
1{ # Si c'est la 1ere ligne
h
d
}
1!{ # Si ce n'est pas la 1ere ligne
x
s/\n//g # On enleve les sauts de ligne
s/[^;]\{1,\};/\L\u&/2 # On met la 1ere lettre du titre en majuscule
p
}
}
/^[A-Z];/! { # Si la ligne ne commence pas par une lettre majuscule puis un point virgule
s/^-.\+$/<br>&/ # Si la ligne commence par -, on ajoute <br> au début
$!{ # Si ce n'est pas la derniere ligne
H
d
}
${ # Si c'est la derniere ligne
H
x
s/\n//g # On enleve les sauts de ligne
s/[^;]\{1,\};/\L\u&/2 # On met la 1ere lettre du titre en majuscule
p
}
}
ce qui donne :
A;Halssnoer met ruit.;Een halssnoer om de mooie harmonie van kleuren van uw outfit extra te onderlijnen! Ontdek hoe dit kleine detail een onweerstaanbare troef wordt ! Ruitvormige hanger aan ketting. Musketonslotje.<br>- Lengte 65 cm + verstelkettinkje van 6 cm.<br>- 100% metaal.<br>- 1 jaar waarborg.;
B;Bloes-trui.;Trui met V-hals met bloeseffect, zichtbaar aan de hals, de polsen en aan de afgeronde onderkant, met comfortabel ruimtesplit voor.<br>- Ca. 72 tot 78 cm volgens de maat.<br>- Trui in 100% acryl. Loze bloes in 100% katoen.<br>- 1 jaar waarborg.;
Dernière modification par chaoswizard (Le 20/08/2009, à 10:11)
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#16 Le 20/08/2009, à 21:07
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
bonjour chaoswizard,
merci pour ton "énorme" coup de main.
j'aimerai pour le coup sincérement te remercier et en discuter un peu plus longuement avec toi mais peut -être hors forum, si tu es d'accord
voici une adresse mail
linuxsite[[arobase]]free.fr
Hors ligne
#17 Le 24/08/2009, à 12:15
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
Bonjour,
J'ai profité du week-end (sans oublier le soleil) pour me pencher un peu plus sur Sed,
Bon c'est pas de la tarte mais c'est comme tout, c'est en tradant que l'on devient ... trader
(humour, c'est juste pour coller à l'actualité !)
J'ai su rajouter au script une petite commande qui va bien afin de doubler le deuxième point-virgule, genre s/;/;;/2 et ça marche (je sais , c'est rien mais quand on débute cela fait chaud au coeur !)
et j'ai trouvé d'occas sur le net le bouquin Sed et Awk d'O'reilly en français
Le script fonctionne donc sur Linux, par contre j'ai une erreur sur Mac :
sed: 11: script.sed: bad flag in substitute command: '#'
j'ai lu sur un forum que cela pouvait être un problème de path !
Hors ligne
#18 Le 29/08/2009, à 20:37
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
Bonjour à vous,
je suis toujours avec mon problème de script sed qui passe sur Linux mais pas sur Mac (malheureusement pas de linux au boulot).
en lisant man sed (dans Mac Os X), j'y trouve ceci :
An ampersand (``&'') appearing in the replacement is replaced by the string matching the RE. The special meaning of ``&'' in this con-
text can be suppressed by preceding it by a backslash. The string ``\#'', where ``#'' is a digit, is replaced by the text matched by
the corresponding backreference expression (see re_format(7)).
cela inspire t-il quelqu'un ?
D'avance merci
Hors ligne
#19 Le 29/08/2009, à 21:32
- chaoswizard
Re : Modification de fichier texte en ligne de commande
Désolé, je ne peux pas aider : pas de Mac à la maison...
Dernière modification par chaoswizard (Le 30/08/2009, à 12:09)
Ubuntu ==> Debian ==> Archlinux
Hors ligne
#20 Le 30/08/2009, à 08:15
- serged
Re : Modification de fichier texte en ligne de commande
Sur ton mac, t'es en bash ou en tcsh (vieux Mac OS/X) ? C'est peut-être le problème...
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#21 Le 30/08/2009, à 13:07
- Jean-paul 3
Re : Modification de fichier texte en ligne de commande
salut,
je suis en Mac OS 10.5. J'ai testé en bash et tcsh, rien à faire ?
je me demande si la version de sed dans Mac OS (qui vient de BSD si je ne m'abuse) ne serait pas un peu "spéciale" voire "spatiale"
J'ai posté sur un forum Mac, on verrat bien
quand je tape
whereis sed
la console renvoie le chemin et quand je tape
sed --version
il me renvoie commande inconnu ???
Hors ligne