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 03/11/2013, à 18:19

Nietzsche14

remplacement sur plusieurs lignes avec sed

Bonjour,

Je voudrais remplacer un texte qui est sur plusieurs lignes.

J'essaie avec la commande sed sans succès.

Voici mon texte de mon fichier test

the sport’s tarnished reputation</span>
</div>
    <span id="date">2013-09-30/01:17:04</span>

voici ce que je voudrais

the sport’s tarnished reputation</span>
        <span id="date">2013-09-30/01:17:04</span>

Voci la commande que j'utilise et qui ne marche pas

sed -i -r 'N;s#</div>\n\t<span id="date">#<span id="date">#' test

Merci pour votre aide smile.

Hors ligne

#2 Le 03/11/2013, à 18:48

pingouinux

Re : remplacement sur plusieurs lignes avec sed

Bonjour,
Peut-être ceci

sed '/<\/div>/d' test

En ligne

#3 Le 03/11/2013, à 19:31

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

En fait j'ai d'autres balises </div>, donc je ne veux supprimer que celle qui se trouve avant <span id="date">2013-09-30/01:17:04</span>
c'est pourquoi je l'écris dans mon sed.

J'ai peur que ta solution me supprime tout mes div fermantes.

Hors ligne

#4 Le 03/11/2013, à 20:15

pingouinux

Re : remplacement sur plusieurs lignes avec sed

J'ai peur que ta solution me supprime tout mes div fermantes.

C'est exact. Voici une solution en python (valable si la chaîne à rechercher n'apparaît qu'une fois), qui va générer un fichier test_new :

$ cat mon_script.py
#! /usr/bin/python

import re

rec=re.compile('(</div>\n)\s*<span id="date">',re.M)

with open('test','r') as f, open('test_new','w') as g :
   fic=f.read()

   k=rec.search(fic)
   if(k) : fic=fic[:k.start(0)]+fic[k.end(1):]

   g.write(fic)
./mon_script.py

Édité : Simplification du script ci-dessus

Ajouté :  Si la chaîne recherchée peut apparaître plusieurs fois, et qu'il faut donc répéter l'opération

#! /usr/bin/python

import re

rec=re.compile('(</div>\n)\s*<span id="date">',re.M)

with open('test','r') as f, open('test_new','w') as g :
   fic=f.read()

   while True :
      k=rec.search(fic)
      if(k) :
         g.write(fic[:k.start(0)])
         fic=fic[k.end(1):]
      else :
         g.write(fic)
         break

Dernière modification par pingouinux (Le 03/11/2013, à 21:14)

En ligne

#5 Le 03/11/2013, à 21:24

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Merci beaucoup pour ce script, hélas elle apparaît une bonne 100aine de fois.

Si je met une boucle while avec if(k) comme condition, qu'en penses-tu?

Hors ligne

#6 Le 03/11/2013, à 22:52

Hizoka

Re : remplacement sur plusieurs lignes avec sed

Donne un exemple plus grand de ton fichier et de ce que tu veux.

Tu veux virer tous les div qui suivent ce texte ?

the sport’s tarnished reputation</span>
</div>
    <span id="date">2013-09-30/01:17:04</span>

car on peut faire un truc du genre :

cat test
=>
the sport’s tarnished reputation</span>
</div>
    <span id="date">2013-09-30/01:17:04</span>

blablabla
    
the sport’s tarnished reputation</span>
</div>
    <span id="date">2013-09-30/01:17:04</span>


sed "/the sport’s tarnished reputation/ {n;d}" test
=>
the sport’s tarnished reputation</span>
    <span id="date">2013-09-30/01:17:04</span>

blablabla
    
the sport’s tarnished reputation</span>
    <span id="date">2013-09-30/01:17:04</span>

Dernière modification par Hizoka (Le 03/11/2013, à 22:53)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#7 Le 03/11/2013, à 23:49

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Non ce texte n'est pas le seul qui précede cette association de balises.

Voila à quoi ressemble mon texte

<div id="vocabulaire">
	<span id="ex">an outsider
who has vowed to reform
the sport’s tarnished reputation</span>
</div>
	<span id="date">2013-09-30/01:17:04</span>
<div id="vocabulaire">
	<span id="ex">His re-election campaign
was mired in controversy</span>
</div>
	<span id="date">2013-09-30/01:23:47</span>
<div id="vocabulaire">
	<span id="mot">smash up</span>
	<span id="date">2013-10-08/15:22:03</span>
	<div id="def">

Hors ligne

#8 Le 03/11/2013, à 23:54

pingouinux

Re : remplacement sur plusieurs lignes avec sed

@Nietzsche14 : As-tu vu que j'avais complété mon message #4 ? Le second script devrait faire l'affaire.

En ligne

#9 Le 04/11/2013, à 01:07

Hizoka

Re : remplacement sur plusieurs lignes avec sed

et il faut virer quoi dans l'exemple ci dessus ?
juste les </div> ?

et tous ces div sont suivit de <span id="date"> ?

Dernière modification par Hizoka (Le 04/11/2013, à 01:08)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 04/11/2013, à 01:20

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Non pas tous, je n'ai prix qu'un extrait de mon fichier et je n'ai pas fait attention qu'il n'y avait que ces cas là.
Oui simplement enlever le div

Voila un autre extrait plus long.

<div id="vocabulaire">
	<span id="date">2013-09-30/00:56:57</span>
	<span id="ex">it is good but people should avoid being overly excited</span>
</div>

<div id="vocabulaire">
	<span id="ex">an outsider
who has vowed to reform
the sport’s tarnished reputation</span>
</div>
	<span id="date">2013-09-30/01:17:04</span>
<div id="vocabulaire">
	<span id="ex">His re-election campaign
was mired in controversy</span>
</div>
	<span id="date">2013-09-30/01:23:47</span>
<div id="vocabulaire">
	<span id="mot">smash up</span>
	<span id="date">2013-10-08/15:22:03</span>
	<div id="def">
		<span id="verb">
The noun smash-up has 1 sense (no senses from tagged texts)<br/>
1. smash, smash-up -- (a serious collision (especially of motor vehicles))<br/>
The verb smash up has 1 sense (no senses from tagged texts)<br/>
1. bang up, smash up, smash -- (damage or destroy as if by violence; <em>"The teenager banged up the car of his mother"</em>)<br/>
		</span>
	</div>
</div>

<div id="vocabulaire">
	<span id="ex">The careless politicians who smash things up</span>
</div>
	<span id="date">2013-10-08/15:24:20</span><br/>
<div id="vocabulaire">
	<span id="mot">plucked</span>
	<span id="date">2013-10-08/15:28:04</span>
	<div id="def">
		<span id="verb">
The verb pluck has 6 senses (first 1 from tagged texts)<br/>
1. (3) pluck, tweak, pull off, pick off -- (pull or pull out sharply; <em>"pluck the flowers off the bush"</em>)<br/>
2. hustle, pluck, roll -- (sell something to or obtain something from by energetic and especially underhanded activity)<br/>
3. overcharge, soak, surcharge, gazump, fleece, plume, pluck, rob, hook -- (rip off; ask an unreasonable price)<br/>
4. pluck, plunk, pick -- (pull lightly but sharply with a plucking motion; <em>"he plucked the strings of his mandolin"</em>)<br/>
5. pluck, pull, tear, deplume, deplumate, displume -- (strip of feathers; <em>"pull a chicken"; "pluck the capon"</em>)<br/>
6. pick, pluck, cull -- (look for and gather; <em>"pick mushrooms"; "pick flowers"</em>)<br/>
The adj plucked has 2 senses (no senses from tagged texts)<br/>
1. plucked -- (of a stringed instrument; sounded with the fingers or a plectrum)<br/>
2. plucked -- (having the feathers removed, as from a pelt or a fowl; <em>"a plucked chicken"; "an unfeathered goose"</em>)<br/>
		</span>
	</div>
</div>

<div id="vocabulaire">
	<span id="mot">shunning</span>
	<span id="date">2013-10-08/15:31:26</span>
	<div id="def">
		<span id="verb">
The noun shunning has 1 sense (no senses from tagged texts)<br/>
1. avoidance, turning away, shunning, dodging -- (deliberately avoiding; keeping away from or preventing from happening)<br/>
The verb shun has 2 senses (first 1 from tagged texts)<br/>
1. (4) shun, eschew -- (avoid and stay away from deliberately; stay clear of)<br/>
2. banish, ban, ostracize, ostracise, shun, cast out, blackball -- (expel from a community or group)<br/>
		</span>
	</div>
</div>

<div id="vocabulaire">
	<span id="ex">Young people across China are
increasingly shunning
monotonous</span>
</div>
	<span id="date">2013-10-08/15:31:54</span><br/>
<div id="vocabulaire">
	<span id="mot">perils</span>
	<span id="date">2013-10-08/15:34:29</span>
	<div id="def">
		<span id="verb">
The noun peril has 3 senses (first 1 from tagged texts)<br/>
1. (1) hazard, jeopardy, peril, risk, endangerment -- (a source of danger; a possibility of incurring loss or misfortune; <em>"drinking alcohol is a health hazard"</em>)<br/>
2. riskiness, peril -- (a state of danger involving risk)<br/>
3. risk, peril, danger -- (a venture undertaken without regard to possible loss or injury; <em>"he saw the rewards but not the risks of crime"; "there was a danger he would do the wrong thing"</em>)<br/>
The verb peril has 2 senses (no senses from tagged texts)<br/>
1. endanger, jeopardize, jeopardise, menace, threaten, imperil, peril -- (pose a threat to; present a danger to; <em>"The pollution is endangering the crops"</em>)<br/>
2. queer, expose, scupper, endanger, peril -- (put in a dangerous, disadvantageous, or difficult position)<br/>
		</span>
	</div>
</div>

<div id="vocabulaire">
	<span id="ex">and examine the
potential perils of their
chosen paths</span>
</div>
	<span id="date">2013-10-08/15:35:17</span><br/>
<div id="vocabulaire">
	<span id="mot">shake-up</span>
	<span id="date">2013-10-08/15:36:13</span>
	<div id="def">
		<span id="verb">
The noun shake-up has 1 sense (no senses from tagged texts)<br/>
1. reorganization, reorganisation, shake-up, shakeup -- (the imposition of a new organization; organizing differently (often involving extensive and drastic changes); <em>"a committee was appointed to oversee the reorganization of the curriculum"; "top officials were forced out in the cabinet shakeup"</em>)<br/>
The verb shake up has 6 senses (first 1 from tagged texts)<br/>
1. (1) jar, shake up, bump around -- (shock physically; <em>"Georgia was shaken up in the Tech game"</em>)<br/>
2. reorganize, reorganise, shake up -- (organize anew; <em>"We must reorganize the company if we don't want to go under"</em>)<br/>
3. succuss, shake up -- (shake; especially (a patient to detect fluids or air in the body))<br/>
4. stimulate, shake, shake up, excite, stir -- (stir the feelings, emotions, or peace of; <em>"These stories shook the community"; "the civil war shook the country"</em>)<br/>
5. agitate, vex, disturb, commove, shake up, stir up, raise up -- (change the arrangement or position of)<br/>
6. fluff up, plump up, shake up -- (make fuller by shaking; <em>"fluff up the pillows"</em>)<br/>
		</span>
	</div>
</div>

<div id="vocabulaire">
	<span id="mot">lacklustre</span>
	<span id="date">2013-10-08/15:37:30</span>
	<div id="def">
		<span id="verb">
The adj lacklustre has 2 senses (no senses from tagged texts)<br/>
1. lackluster, lacklustre, lusterless, lustreless -- (lacking brilliance or vitality; <em>"a dull lackluster life"; "a lusterless performance"</em>)<br/>
2. lackluster, lacklustre, lusterless, lustreless -- (lacking luster or shine; <em>"staring with lackluster eyes"; "lusterless hair"</em>)<br/>
		</span>
	</div>
</div>

<div id="vocabulaire">
	<span id="ex">his performance
is widely considered to
be lacklustre</span>
</div>

Hors ligne

#11 Le 04/11/2013, à 03:02

Hizoka

Re : remplacement sur plusieurs lignes avec sed

Donc virer tous les </div> qui ferment <div id="vocabulaire">, c'est ça ?

Il ne faut pas toucher à tous les </div>, si j'ai bien compris.

Dernière modification par Hizoka (Le 04/11/2013, à 03:03)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#12 Le 04/11/2013, à 13:14

gigiair

Re : remplacement sur plusieurs lignes avec sed

Je pense que l'idée originale est la bonne solution. Simplement pour une raison que j'ignore le modèle \n\t ne capture rien.
Je ne suis pas trop compétent en sed.

Par contre, en Emacs, j'ai effectué une recherche-remplacement qui fonctionne parfaitement.
Au besoin on peut exécuter  en mode batch , mais j'imagine qu'un spécialiste nous donnera la solution en sed.


--
JJR.

Hors ligne

#13 Le 04/11/2013, à 13:44

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Non seulement les </div> qui précède <span id="date"> les autres sont bons.

Hors ligne

#14 Le 04/11/2013, à 13:52

pingouinux

Re : remplacement sur plusieurs lignes avec sed

Peut-être ceci :

sed -r '/<\/div>/N;s#</div>\n(\s*<span id="date">)#\1#' test

En ligne

#15 Le 04/11/2013, à 14:16

Hizoka

Re : remplacement sur plusieurs lignes avec sed

Hizoka a écrit :

et il faut virer quoi dans l'exemple ci dessus ?
juste les </div> ?

et tous ces div sont suivit de <span id="date"> ?

Nietzsche14 a écrit :

Non pas tous, je n'ai prix qu'un extrait de mon fichier et je n'ai pas fait attention qu'il n'y avait que ces cas là.

Nietzsche14 a écrit :

Non seulement les </div> qui précède <span id="date"> les autres sont bons.

J'ai un peu de mal à suivre XD

Il faut donc virer tous les </div> précédant les <span id="date"> ou autrement dit virer les </div> qui sont suivis de <span id="date">.

La soluce de pingouinux fonctionne dans mes tests.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#16 Le 04/11/2013, à 15:08

gigiair

Re : remplacement sur plusieurs lignes avec sed

Hizoka a écrit :

La soluce de pingouinux fonctionne dans mes tests.

Ben oui, c'est le plus logique. J'aimerais savoir pourquoi la solution originelle ne marche pas. C'est ce que j'aurais essaé en premier.


--
JJR.

Hors ligne

#17 Le 04/11/2013, à 15:17

pingouinux

Re : remplacement sur plusieurs lignes avec sed

gigiair #16 a écrit :

J'aimerais savoir pourquoi la solution originelle ne marche pas.

C'est parce que les lignes sont regroupées par 2, et il ne traite que les </div> qui sont sur des lignes impaires.

En ligne

#18 Le 04/11/2013, à 15:32

gigiair

Re : remplacement sur plusieurs lignes avec sed

pingouinux a écrit :
gigiair #16 a écrit :

J'aimerais savoir pourquoi la solution originelle ne marche pas.

C'est parce que les lignes sont regroupées par 2, et il ne traite que les </div> qui sont sur des lignes impaires.

Je suis une tanche en sed. Quelle partie de la commande provoque ça ?


--
JJR.

Hors ligne

#19 Le 04/11/2013, à 15:41

pingouinux

Re : remplacement sur plusieurs lignes avec sed

Quelle partie de la commande provoque ça ?

'N;'
Voici un extrait de man sed

n N    Read/append the next line of input into the pattern space.

En ligne

#20 Le 04/11/2013, à 20:05

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Merci beaucoup pingouinux, ça marche à la perfection.

Maintenant plus difficile, est-il possible d'intervertir ma balise <span id="ex">contenu</span> avec celle <span id="date">contenu<span><br/>
en d'autre terme au lieu de ca

<div id="vocabulaire">
	<span id="ex">Young people across China are
increasingly shunning
monotonous</span>
	<span id="date">2013-10-08/15:31:54</span><br/>   #cette ligne doit remonter au dessus
<div id="vocabulaire">
	<span id="mot">perils</span>
	<span id="date">2013-10-08/15:34:29</span>
	<div id="def">
		<span id="verb">
The noun peril has 3 senses (first 1 from tagged texts)<br/>

je voudrais ça

<div id="vocabulaire">
<span id="date">2013-10-08/15:31:54</span><br/>  #elle est remontée
	<span id="ex">Young people across China are
increasingly shunning
monotonous</span>
	
<div id="vocabulaire">
	<span id="mot">perils</span>
	<span id="date">2013-10-08/15:34:29</span>
	<div id="def">
		<span id="verb">
The noun peril has 3 senses (first 1 from tagged texts)<br/>

J'exagère un peu, pardon, mais c'est un nouveau défis.

Je n'ai pas compris aussi le terme /<\/div>/N; que tu as passé devant le  s#code#remplacement#. Comment est-ce qu'il entre en compte dans la commande sed?

merci encore et bonne soirée.

Hors ligne

#21 Le 04/11/2013, à 20:32

pingouinux

Re : remplacement sur plusieurs lignes avec sed

Nietzsche14 #20 a écrit :

Je n'ai pas compris aussi le terme /<\/div>/N; que tu as passé devant le  s#code#remplacement#.

On ne commence le traitement que pour les lignes contenant </div>. Sinon, le sed ressemble beaucoup à celui que tu suggérais en #1.

Pour ton nouveau problème, je te suggère ce script en python :

$ cat autre_script.py
#! /usr/bin/python

import sys, re

rec=re.compile('(<span id="ex">[^<]+</span>)(\s*)(<span id="date">[^<]+</span><br/>)')

with open(sys.argv[1],'r') as f, open(sys.argv[2],'w') as g :
   fic=f.read()

   while True :
      k=rec.search(fic)
      if(k) :
         g.write(fic[:k.start(1)])
         g.write(k.group(3))
         g.write(k.group(2))
         g.write(k.group(1))
         fic=fic[k.end(3):]
      else :
         g.write(fic)
         break

À utiliser ainsi

./autre_script.py fichier_initial fichier_modifie

En ligne

#22 Le 04/11/2013, à 22:46

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Perfecto smile. Je te remercie encore une fois pingouinux.

Merci aussi pour ton explication.
Une autre question. A quoi sert-il d'écrire  [^<]+ devant le </span>.
Si je ne me trompre pas, ça signifie que "<" doit apparaître en première position 1 fois ou plus?

Hors ligne

#23 Le 04/11/2013, à 22:51

Hizoka

Re : remplacement sur plusieurs lignes avec sed

non au contraire :
[^<]+ => Tout caractere sauf < avec ou moins 1 correspondance


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#24 Le 09/11/2013, à 13:10

Nietzsche14

Re : remplacement sur plusieurs lignes avec sed

Merci beaucoup (je n'avais pas vu que mon message ne s'était pas envoyé).

Hors ligne

#25 Le 09/11/2013, à 15:19

Hizoka

Re : remplacement sur plusieurs lignes avec sed

si c'est ok, ajoute un petit [resolu] au titre de ton topic smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne