1/ouvrir V1
2/charger le fichier
3/ se positionner sur le caractère de début d'une balise
4/ taper v
5/ étendre la zone en "surbrillance
6/ taper "d"
7/recommencer pour l'autre balise
8/se positionner sur la première ligne
9/ taper J
Evidemment, si la manip est répétitive, il sera intéressant de l'automatiser d'une façon opu d'une autre
(echo '<ap>Ligne1</ap>' ; echo '<ap>Ligne2</ap>' ) | sed '/<\/ap>$/ { 
N
s:<\/ap>\n<ap>::
}'
donne
<ap>Ligne1Ligne2</ap>
au lieu de
<ap>Ligne1</ap>
<ap>Ligne2</ap>
J'ai utilisé des <ap> et </ap> pour simplifier, mais tu peux faire ce que tu veux.

Mais je reste persuadé que perl serait plus facile pour toi (comme pour tout le monde) ! ! !
Tu as une seule ligne ou plusieurs dans ton fichier ?
pingou, Il est évident (ne le prends pas mal!) que j'ai plusieurs lignes dans mon fichier contenant près de
258260 lignes...
1/ouvrir V1
2/charger le fichier
3/ se positionner sur le caractère de début d'une balise
4/ taper v
5/ étendre la zone en "surbrillance
6/ taper "d"
7/recommencer pour l'autre balise
8/se positionner sur la première ligne
9/ taper J
Evidemment, si la manip est répétitive, il sera intéressant de l'automatiser d'une façon opu d'une autre
pjac, de quel outil parles-tu pour effectuer cette manip assez lourde!

Sophonie.
la manipulation parait lourde parce que j'ai détaillé chaque étape.
s'il s'agit d'une modification localisée, utillise donc un éditeur de texte.J'ai cité vi.
Bien sûr, dans le cas contraire, l'option N de sed est la voie royale
vi IS NOT sed (problème d'automatisation de batch)
As-tu essayé ce qui est décrit dans mon post #22 (qui n'est jamais qu'un exemple un peu plus personnalisé de mon post #9).
Veux-tu un exemple prêt à l'emploi ou veux-tu essayer par toi même de trouver TA solution ?
pjac à écrit :
J'ai cité vi.
J'ai lu V1 dans ton avant-dernier post qui n'est pas vi, donc je me demandais de quel outil il s'agissait?
vi IS NOT V1
mais que veux tu :
- faire de l'interactif
- faire du batch (voir mon post #22)
Je sais bien que vi n'est pas sed. Je posais la question de l'opportunité d'automatiser. Le problème est de savoir s'il y a plusieurs occurrences de la séquence <tag>\n<tag> à supprimer.
Désolé pour la faute de frappe
Le problème est de savoir s'il y a plusieurs occurrences de la séquence <tag>\n<tag> à supprimer
Comme d'habitude, le problème doit être posé avec précision pour avoir une réponse précise.
Effectivement, il y a plusieurs occurrences de du "tag" <dc:description>, d'ailleurs la mise en oeuvre du post
#22 me donne le résultat suivant :
(echo '<ap:description>Rotonde édifiée sur le belvédère de jardin.</ap:description>' ; echo '<ap:description>Trois escaliers donnent accès à ce belvédère de jardin; entouré de catalpas. Les bancs en marbre blanc (il en reste deux sur trois) sculptés encerclent la rotonde de jardin; d'inspiration ionique; dit</ap:description>') | sed '/<\/ap\:description>$/ { N s:<\/ap\:description>\n<ap\:description>:: }'
>
et je suis obligé de faire ceci
 ^C
pour reprendre la main!
Et avec les retours à la ligne (qui ont leur importance pour sed )
/critere/ {
N
s :critere:remplacement:
}
IS NOT
/critere/ { N s :critere:remplacement: }
De plus le «>» qui s'affiche est le prompt secondaire qui montre que des '' ou des ' ou des {} ne sont pas correctement fermées.

Essaie de faire un bête
echo "coucou
(sans fermeture de ") et tu devras interrompre par <CTRL><C>
Mais là c'est un problème de SHELL et non pas de sed .

Ton problème vient manifestement du «d'inspiration» qui contient une «'» et pose problème pour un «echo 'blabla d'inspiration blabla'» car dans ce cas il y a trois «'», donc une de trop.

Dans ce cas utilise des «"» mais à condition qu'il n'y ait pas de caractère interpolables par le SHELL.

Dès que des chaines de caractères sont complexes il vaut mieux utiliser des langages (comme perl à tout hasard) et non plus des appels via le SHELL qui a ses propres contraintes.
Ton problème vient manifestement du «d'inspiration» qui contient une «'» et pose problème pour un «echo 'blabla d'inspiration blabla'» car dans ce cas il y a trois «'», donc une de trop.

Dans ce cas utilise des «"» mais à condition qu'il n'y ait pas de caractère interpolables par le SHELL.
Ok, ça marche en mettant des "" au lieu des '', il est vrai que c'est un grand classique des chaînes de
caractères.
Dès que des chaines de caractères sont complexes il vaut mieux utiliser des langages (comme perl à tout hasard) et non plus des appels via le SHELL qui a ses propres contraintes.
Je me mettrai au Perl certes mais je voudrai uniquement apprendre les bases (en quelque sorte une introduction minimaliste et informelle à Perl).
Je crois que c'est déjà un bon début ...
pmarion, est-tu prêt à me guider dans cette voie?

Merci encore.
Sophonie.
Avec un fichier /tmp/toto.txt contenant :
blabla
blablablabla
<ap:description>Rotonde édifiée sur le belvédère de jardin.</ap:description>
<ap:description>Trois escaliers donnent accès à blabla1 </ap:description>
blabla
blabla
blabla
<ap:description>Rotonde édifiée sur le belvédère de jardin.</ap:description>
<ap:description>Trois escaliers donnent accès à blabla2 </ap:description>
blablabla
un script perl comme celui ci
#!/usr/bin/perl
open (SCE, "/tmp/toto.txt") ;
my $montexte = '' ; 
while (<SCE>) {
  $montexte .= $_ ; 
}
$montexte =~ s/<\/ap:description>\n<ap:description>//g ;
print $montexte;
donne cela :
blabla
blablablabla
<ap:description>Rotonde édifiée sur le belvédère de jardin.Trois escaliers donnent accès à blabla1 </ap:description>
blabla
blabla
blabla
<ap:description>Rotonde édifiée sur le belvédère de jardin.Trois escaliers donnent accès à blabla2 </ap:description>
blablabla
A part cela perl est compliqué ! ! ! Laissez moi rire ! ! !

PIGFY ::= Perl Is Good For You

Cela dit c'est un script écrit sur le coin d'une table pendant le déjeuner, et il faudrait gérer une liste des noms de fichiers source, les erreurs possibles, un ou des fichiers diestinations, ..... enfin encore plein de rigolades perleries.
hmm. tout ira bien tant que le fichier tient en mémoire. Vive le swap!
Une fois de plus le problème n'est pas précisé on sait que le fichier fait 300.000 lignes mais on ne sait rien sur la taille des lignes et donc du fichier.
wc nom_fichier_source
permettrrait d'en savoir plus

300.000 * 132 = 39.600.000 (39MO)
je ne pense pas qu'il y ait des problèmes de swap.

de toute façon vi par défaut monte tout le fichier en mémoire, donc pourrait poser aussi des problèmes de swap.


Mais s'il devait y en avoir il suffit de remettre, il suffirait de tester la taille de la variable, et de faire un affichage et une remise à zéro lorsque que l'on atteint une certaine taille et que la ligne en cours ne se termine pas par «<ap:description>».
Si cela devait être nécessaire, j'essaierai d'ajouter ces modifications au prochain déjeuner.
sed '/<\/ap\:description>$/ {
N
s:<\/ap\:description>\n<ap\:description>::
}' -i BASE_MERIMEE.xml
En effectuant cette commande sed ne modifie pas le fichier BASE_MERIMEE.xml, les éléments
<ap:description> sont toujours doublés!

Sophonie.
Avec mon fichier /tmp/toto.txt (voir mon post précédent).
sed '/<\/ap:description>$/ {
N
s:<\/ap:description>\n<ap:description>::
}' /tmp/toto.txt
affiche
blabla
blablablabla
<ap:description>Rotonde édifiée sur le belvédère de jardin.Trois escaliers donnent accès à blabla1 </ap:description>
blabla
blabla
blabla
<ap:description>Rotonde édifiée sur le belvédère de jardin.Trois escaliers donnent accès à blabla2 </ap:description>
blablabla
et avec une option «-i» cela fonctionne aussi.

D'où viennent ces fichiers (environnement Micro$oft, MAC, ...) il faudrait bien vérifier qu'il y a bien un simple  «\r» et non pas un «\d\r» en fin de chaque ligne .

grep ":description>" nom_fichier_source | hexdump -C
pour visualiser le contenu en hexadécimal de chaque ligne.
D'où viennent ces fichiers (environnement Micro$oft, MAC, ...) il faudrait bien vérifier qu'il y a bien un simple «\r» et non pas un «\d\r» en fin de chaque ligne .
Ils proviennent probablement de Microsoft Windows puisque ce sont des données du Ministère et de l'Etat.
00000000  20 20 20 20 20 20 20 20  3c 61 70 3a 64 65 73 63  |        <ap:desc|
00000010  72 69 70 74 69 6f 6e 3e  52 6f 74 6f 6e 64 65 20  |ription>Rotonde |
00000020  c3 a9 64 69 66 69 c3 a9  65 20 73 75 72 20 6c 65  |..difi..e sur le|
00000030  20 62 65 6c 76 c3 a9 64  c3 a8 72 65 20 64 65 20  | belv..d..re de |
00000040  6a 61 72 64 69 6e 2e 3c  2f 61 70 3a 64 65 73 63  |jardin.</ap:desc|
00000050  72 69 70 74 69 6f 6e 3e  0a 20 20 20 20 20 20 20  |ription>.
Voici le retour hexadécimal de la commande hexdump
Mais d'où viennent ces espaces :
- devant la chaine «<20><20><20>.....<ap:description>»
- après la sous-chaine «</ap:description>\n<20><20><20><20><20>..................

Pour qui sont ces serpents espaces qui sifflent sur vos têtes figurent dans ton fichier (PCC Jean RACINE)

Donc l'expression régulière «</ap:description>\n<ap:description>» ne trouve rien car il y a plusieurs espaces entre </ap:description>\n et <ap:description>

Une fois de plus le problème est mal posé, car s'il y a des espaces en début de ligne (à quoi peuvent-ils servir devant une entité XML ?) il faut spécifier un ou plusieurs espaces dans les différentes expressions régulières.
Q'il y ait des espaces dans le contenu logique d'une entité XML est normal mais il me semble aberrant inutile d'en spécifier entre deux entités XML
pmarion,

Je comprends tout à fait que tu trouves cela inutile voire "aberrant"; d'ailleurs tu peux te lacher!
Je ne fais que récupérer des données clients élaborées sous Microsoft Windows avec toutes les
aberrations que cela entraine, mais bon que veux-tu? Quand il faut le faire il faut le faire.

Comment procéder pour indiquer ces caractères d'espacement dans l'expression régulière?

Sophonie.