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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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'
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
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 !
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)
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)