Aide commande ed/sed/awk/perl

[Résolu/Fermé]
Signaler
-
 vanhell -
Bonjour,
J'aimerai dans un fichier texte, supprimer tous les retours à la ligne seulement pour le texte contenu entre motcle1 et motcle2 (la ligne de motcle1 incluse) et laisser le reste du texte inchangé.
motcle1 et motcle2 sont toujours en début de ligne.

Par exemple :

texte texte texte texte texte
texte texte texte
motcle1
texte texte
texte
texte texte texte
motcle2
texte texte
texte

doit devenir :

texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte
motcle2
texte texte
texte

Comment faire ça avec sed? (ou autre)
Merci d'avance pour votre aide!

15 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Salut,
sed '/motcle1/{:z;N;/motcle2$/!bz;s/\n/ /g;s/motcle2/\n&/}'
;-))
Merci pour la réponse super rapide!
Je viens d'essaye mais j'obtiens cette erreur :

sed: The label /motcle1/{:z;N;/motcle2$/!bz;s/\n/ /g;s/motcle2/\n&/} is greater than eight characters.

Je suis sur un environement UNIX AIX, j'ai la commande sed mais pas gsed, peut être a cause de ça non?
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Essaie comme ça alors :
sed '
/motcle1/ {
:z
N
/motcle2$/ !b z
s/\n/ /g
s/motcle2/\n&/
}
'
Comme ça plus d'erreurs mais uniquement les 2 premières lignes affichées :

texte texte texte texte texte
texte texte texte
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Bizarre chez moi ça marche bien :
[tmpfs]$ cat plop
texte texte texte texte texte
texte texte texte
motcle1
texte texte
texte
texte texte texte
motcle2
texte texte
texte

[tmpfs]$ sed '
/motcle1/ {
:z
N
/motcle2$/ !b z
s/\n/ /g
s/motcle2/\n&/
}
' plop
texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte
motcle2
texte texte
texte

[tmpfs]$  
;-\ ??

Tu peux faire un copier/coller comme le mien de ce que tu as d'affiché dans ton terminal ?
[test]$ cat sed.txt
texte texte texte texte texte
texte texte texte
motcle1
texte texte
texte
texte texte texte
motcle2
texte texte
texte
[test]$ sed '
> /motcle1/ {
> :z
> N
> /motcle2$/ !b z
> s/\n/ /g
> s/motcle2/\n&/
> }
> ' sed.txt
texte texte texte texte texte
texte texte texte
[test]$
Non en faite ça fonctionne presque, le fichier sur lequel je testé provenait de windows donc fin de ligne avec \r\n...

Avec le même fichier crééer directement sur le serveur j'obtiens maintenant ça :

texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte nmotcle2
texte texte
texte


C'est preque bon il y a un juste un bug juste avant le "motcle2" il a un un "n" au lieu d'un retour a la ligne, je ne sais pas ou est passé l'antislah XD
Bizare surtout que ça fonctionne chez toi...
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Bizarre effectivement ;-\

Par contre chez moi c'est du GNU/Linux et pas du AIX...

Essaies de supprimer "s/motcle2/\n&/" et refais un test.
J'obtiens ceci :
$ sed '
> /motcle1/ {
> :z
> N
> /motcle2$/ !b z
> s/\n/ /g
> }
> ' sed.txt
texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte motcle2
texte texte
texte
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Essaye comme ça :
sed '
/motcle1/ {
:z
N
/motcle2$/ !b z
s/\n[^\(mocle2\)]/ /g
}
'
Presque! de plus en plus pret lol

texte texte texte texte texte
texte texte texte
motcle1 exte texte exte exte texte texte
motcle2
texte texte
texte

le "t" en moins dans "mocle2" c'est fait expres?

Je pensais que c'était une faute de frappe mais en remmettant le t je n'ai plus aucun changement par rapport au fichier d'origine :

texte texte texte texte texte
texte texte texte
motcle1
texte texte
texte
texte texte texte
motcle2
texte texte
texte
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Là je sèche :-((

Chez moi tout marche bien ;-\

Je parierai plus sur le fait que tu sois sur AIX, doit y avoir (je ne sais où) des interactions entre sed et le shell ;-\
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Tu peux toujours essayer avec "ed" :
[tmpfs]$ cat plop
texte texte texte texte texte
texte texte texte
motcle1
texte texte
texte
texte texte texte
motcle2
texte texte
texte

[tmpfs]$ ed -s plop <<<$'/motcle1/,/motcle2/g/$/s/.$/& /g\n/motcle1/,/motcle2/-1j\nw'

[tmpfs]$ cat plop
texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte
motcle2
texte texte
texte
[tmpfs]$
;-))
Rebonjour!
Non ça ne fonctionne pas sur cette machine avec ed, la shell est ksh ça vient surement de la.
Il faudrait trouver une solution avec awk ou perl...
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
Salut,
$ cat fichier.txt
texte texte texte texte texte
texte texte texte
motcle1
texte texte
texte
texte texte texte
motcle2
texte texte
texte
$ perl -ne 's/\n/ / if /motcle1/../motcle2/;s/motcle2 /\nmotcle2\n/;print' fichier.txt
texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte
motcle2
texte texte
texte
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Oui pareil je ne comprend pas pourquoi ta solution et la mienne avec awk ne fonctionne pas a chaque fois...
Mais oui comme tu le dis le principal c'est que ça fonctionne en perl.
Encore merci à vous deux et bon week end!
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881 > vanhell
Je reviens à la charge avec "sed", ça :
sed '
/SELECT/ {
    :z
    N
    /\nFROM/ !b z
    s/\n[^\(FROM\)]/ /g
}' perl2.txt
ça marche toujours pas ?
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Heu ça fonctionne à part que ça enlève la premiere le premier de caractere des champs SELECT sauf le premier, comme dans ta solution au post 10
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881 > vanhell
Toujours aussi bizarre ;-\

Chez moi avec ton fichier perl2.txt ça marche très bien ;-\
>
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Oui j'avais essayé chez moi aussi le code avec sed sur ubuntu ça fonctionnait mais la sur AIX avec ksh ça na fonctionne pas.
Pas grave le principal c'est d'avoir trouver une autre solution.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 881
Et comme ça :
[tmpfs]$ echo 'H
/motcle1/,/motcle2/g/$/s/.$/& /g
/motcle1/,/motcle2/-1j
.
w' | ed -s plop
???

Édit : C'est plus simple comme ça...

Version affichage :
$ echo '/motcle1/,/motcle2/g/$/s/.$/& /g
/motcle1/,/motcle2/-1j
,p' | ed -s plop
texte texte texte texte texte
texte texte texte
motcle1 texte texte texte texte texte texte
motcle2
texte texte
texte
Version écriture :
$ echo '/motcle1/,/motcle2/g/$/s/.$/& /g
/motcle1/,/motcle2/-1j
w' | ed -s plop
;-))