OVH Cloud OVH Cloud

Sed dans un script sh

2 réponses
Avatar
Vincent Ramos
Bonjour,

J'ai besoin de manipuler des données. Sed me semble répondre à mes
besoins, mais je ne parviens pas à mes fins.

Dans une liste du type :
azeazea:
dfsdfsd,
fsdfsdf,
vxcvxcv,

uiyuiyu:
znpvryh,

je veux que les virgules suivies d'une ligne vide soient effacés (ou
remplacées par autre chose, pour marquer que la liste est fermée).

J'ai testé, en vain, des formules à base de
sed 's/,$\n^$//g' source > resultat
avec, comme variantes, 's/,$\n//g', 's/,\n//g', 's/,\\n//g', etc. Je
n'obtiens rien de concluant.

Inversement, si je pars d'un fichiers contenant des données
présentées :
azeazea:
dfsdfsd
fsdfsdf

vxcvxcv:
uiyuiyu
znpvryh

et si je veux que les fins de lignes soient marquées par une virgule
sauf si on trouve un <:> devant, j'ai
sed 's/[^:]$/&,/g' source > resultat
mais je ne trouve pas comment obtenir la restriction supplémentaire :
« pas de virgule si on trouve une ligne vide après ».

Où fais-je une erreur ? Merci de vos conseils.

2 réponses

Avatar
Stephane Chazelas
On Mon, 24 Oct 2005 03:09:47 +0200, Vincent Ramos wrote:
Bonjour,

J'ai besoin de manipuler des données. Sed me semble répondre à mes
besoins, mais je ne parviens pas à mes fins.

Dans une liste du type :
azeazea:
dfsdfsd,
fsdfsdf,
vxcvxcv,

uiyuiyu:
znpvryh,

je veux que les virgules suivies d'une ligne vide soient effacés (ou
remplacées par autre chose, pour marquer que la liste est fermée).


sed -n '
/./!{
x
s/,$//
x
}
x
1!p
${g;p;}'

J'ai testé, en vain, des formules à base de
sed 's/,$n^$//g' source > resultat


Evidemment, sed opere une ligne a la fois par defaut. Donc, ce
que peut matcher /.../ ne contient pas de saut de ligne par
definition. Si tu veux que le pattern space contienne un saut de
ligne, il faut l'y ajouter:

sed '
/,$/{
N # ajouter la ligne suivante au pattern space
s/,n$/
/
D
}'


--
Stephane

Avatar
Vincent Ramos
Stephane Chazelas égrapsen en
 :

Evidemment, sed opere une ligne a la fois par defaut. Donc, ce
que peut matcher /.../ ne contient pas de saut de ligne par
definition.


En relisant la page de manuel, je m'en suis rendu compte.

Si tu veux que le pattern space contienne un saut de
ligne, il faut l'y ajouter:
sed '
/,$/{
N # ajouter la ligne suivante au pattern space
s/,n$/
/
D
}'


Merci.