OVH Cloud OVH Cloud

sed multiligne et vieil unix

2 réponses
Avatar
Bob qui Trolle
Dans un fichier ASCII sur un très vieil Unix, je souhaiterais remplacer
chaque ligne d'un bloc délimité par :

- Le début d'une ligne commençant par un certain mot-clé (en la
chaîne-clé "CREATE INDEX")
- La fin de la première ligne suivant la ligne de début se terminant par
le caractère point-virgule

par cette même ligne précédée des caractères dièze+espace .

{
exemple de bloc de deux lignes matchant : {

CREATE INDEX bobo, bibi, baba,
blu, bri, baz, booze;
}
Ce que je voudrais obtenir : {
# CREATE INDEX bobo, bibi, baba,
# blu, bri, baz, booze;
}
}

Avec sed, je vois bien commencer effacer un bloc ainsi sélectionné. Mais
est-il possible avec sed de remplacer chaque ligne d'un bloc multiligne
sélectionné ?

Si ce n'est pas possible avec sed, est-ce possible avec un vieil awk ?

2 réponses

Avatar
Stephane Chazelas
2004-11-10, 07:51(+01), Bob qui Trolle:
[...]
exemple de bloc de deux lignes matchant : {

CREATE INDEX bobo, bibi, baba,
blu, bri, baz, booze;
}
Ce que je voudrais obtenir : {
# CREATE INDEX bobo, bibi, baba,
# blu, bri, baz, booze;
}
}

Avec sed, je vois bien commencer effacer un bloc ainsi sélectionné. Mais
est-il possible avec sed de remplacer chaque ligne d'un bloc multiligne
sélectionné ?

Si ce n'est pas possible avec sed, est-ce possible avec un vieil awk ?


awk '
/CREATE INDEX/ {
if ((getline line) > 0) {
if (line ~ /;$/)
$0 = "# " $0 "n# " line
else
$0 = $0 "n" line
}
}
{print}'

Avec sed:

sed -n '
$!{
/CREATE INDEX/{
h
n
/;$/{
s/^/# /
x
s/^/# /
x
}
H
g
}
}
p'

(pas testé)

--
Stephane

Avatar
Bob qui Trolle
Stephane Chazelas wrote:

Avec sed:

sed -n '
$!{
/CREATE INDEX/{
h
n
/;$/{
s/^/# /
x
s/^/# /
x
}
H
g
}
}
p'

(pas testé)


Bon : je n'ai pas réussi à faire fonctionner ça, que je n'ai pas encore
très bien compris.... (mais merci pour m'avoir fait apprendre le truc du
holdspace h/x/g)

J'ai réussi à faire marcher ça :

/^CREATE INDEX .*[^;]/{
s/^/# &/
n
s/.*;$/# &/
}

Quand ch'rai grand, chfrai mieux !