Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Sed, / et variable

11 réponses
Avatar
Remi Moyen
Salut,

J'ai un script, dans lequel j'ai une variable ($TOTO, disons), qui est un
chemin, donc qui contient plein de '/'. Je veux appliquer sed en utilisant
cette variable pour transformer une liste de chemins. Par exemple, je veux
rajouter $TOTO au début de chacun des chemins d'une liste.

Si je fais :

$ sed "s/^/$TOTO/" file

Ben ça plante. Forcément : $TOTO contient des /, donc quand je fais la
substitution, je me retrouve avec une expression du type :

$ sed "s/^//path/to/somewhere/" file

avec plein de '/' non-protégés.

Faudrait que je protège tous les / dans $TOTO, pour que ça marche. Ma
question, c'est comment faire ça facilement et proprement ?

Pour l'instant, la solution que j'ai trouvée, c'est de faire passer $TOTO
dans une première expression sed, qui remplace tous les '/' par '\/' (ce
que j'adore avec sed, c'est la vitesse à laquelle les expressions
grossissent... :-/ ). Ensuite, tout va bien.

Existe-il une solution plus propre pour automatiquement protéger tout le
contenu d'une variable ?
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

10 réponses

1 2
Avatar
FAb
Remi Moyen writes:

Salut,

J'ai un script, dans lequel j'ai une variable ($TOTO, disons), qui est un
chemin, donc qui contient plein de '/'. Je veux appliquer sed en utilisant cette
variable pour transformer une liste de chemins. Par exemple, je veux rajouter
$TOTO au début de chacun des chemins d'une liste.

Si je fais :

$ sed "s/^/$TOTO/" file

Ben ça plante. Forcément : $TOTO contient des /, donc quand je fais la
substitution, je me retrouve avec une expression du type :

$ sed "s/^//path/to/somewhere/" file

avec plein de '/' non-protégés.

Faudrait que je protège tous les / dans $TOTO, pour que ça marche. Ma question,
c'est comment faire ça facilement et proprement ?

Pour l'instant, la solution que j'ai trouvée, c'est de faire passer $TOTO dans
une première expression sed, qui remplace tous les '/' par '/' (ce que j'adore
avec sed, c'est la vitesse à laquelle les expressions grossissent... :-/
). Ensuite, tout va bien.

Existe-il une solution plus propre pour automatiquement protéger tout le contenu
d'une variable ?


man sed
sed -e "s#^#$TOTO#g"

Avatar
Stephane Chazelas
2005-01-18, 11:26(+01), Remi Moyen:
Salut,

J'ai un script, dans lequel j'ai une variable ($TOTO, disons), qui est un
chemin, donc qui contient plein de '/'. Je veux appliquer sed en utilisant
cette variable pour transformer une liste de chemins. Par exemple, je veux
rajouter $TOTO au début de chacun des chemins d'une liste.

Si je fais :

$ sed "s/^/$TOTO/" file

Ben ça plante. Forcément : $TOTO contient des /, donc quand je fais la
substitution, je me retrouve avec une expression du type :
[...]


sed "s|^|$TOTO|" file

mais ca plantera si $TOTO contient des "|", "&", "" or NL.

Utilise plutot awk:

awk 'BEGIN {toto=ARGV[1]; delete ARGV[1]}
{print toto $0}' "$TOTO" file


--
Stéphane

Avatar
Remi Moyen
On Tue, 18 Jan 2005, Stephane Chazelas wrote:

$ sed "s/^/$TOTO/" file

Ben ça plante. Forcément : $TOTO contient des /, donc quand je fais la
substitution, je me retrouve avec une expression du type :
[...]


sed "s|^|$TOTO|" file


Ça alors... Je ne me serais jamais douté qu'on pouvait utiliser d'autres
caractères que '/' pour séparer les champs !

Mais alors, quels caractères sont utilisables ? Je n'ai aucune allusion à
cette fonctionnalité dans le man de sed. En testant un peu, ça a l'air de
marcher avec @, #, &, |, /, % et même ¤, mais pas avec une lettre
(majuscule ou minuscule, accentuée ou non) ou un chiffre.

Utilise plutot awk:


Oui, c'est vrai. C'est ce qui est à la fois amusant, pratique, mais aussi
ennuyeux dans les commandes unix : y'a toujours plusieurs manières de
faire les choses, et c'est dur (en tout cas pour moi qui n'y connait pas
grand chose !) de faire le choix entre les possibilités -- et déjà
d'établir la liste des possibilités !

Merci pour ta réponse rapide (et celle de FAb, aussi), en tout cas !
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


Avatar
Stephane Chazelas
2005-01-18, 12:03(+01), Remi Moyen:
[...]
sed "s|^|$TOTO|" file


Ça alors... Je ne me serais jamais douté qu'on pouvait utiliser d'autres
caractères que '/' pour séparer les champs !

Mais alors, quels caractères sont utilisables ? Je n'ai aucune allusion à
cette fonctionnalité dans le man de sed. En testant un peu, ça a l'air de
marcher avec @, #, &, |, /, % et même ¤, mais pas avec une lettre
(majuscule ou minuscule, accentuée ou non) ou un chiffre.


Quelle version de sed?

$ echo foo | sed 's9foo9bar9'
bar

(GNU sed 4.1.2)

Page info:

The syntax of the `s' (as in substitute) command is
`s/REGEXP/REPLACEMENT/FLAGS'. The `/' characters may be uniformly
replaced by any other single character within any given `s' command.
The `/' character (or whatever other character is used in its stead)
can appear in the REGEXP or REPLACEMENT only if it is preceded by a `'
character.

Il apparait que seul le character n ne peut etre utilisé (meme
NUL et marchent chez moi).


Utilise plutot awk:


Oui, c'est vrai. C'est ce qui est à la fois amusant, pratique, mais aussi
ennuyeux dans les commandes unix : y'a toujours plusieurs manières de
faire les choses, et c'est dur (en tout cas pour moi qui n'y connait pas
grand chose !) de faire le choix entre les possibilités -- et déjà
d'établir la liste des possibilités !
[...]


D'ou un interet de laisser tomber le shell et de programmer en
perl, ruby, python et meme pourquoi pas clisp a la place.

--
Stéphane


Avatar
Jogo
Le 18 janv. 2005, Stephane Chazelas a écrit dans fr.comp.os.unix :

D'ou un interet de laisser tomber le shell et de programmer en
perl, ruby, python et meme pourquoi pas clisp a la place.


Je ne connais pas les 3 derniers, mais avec perl le problème restera le
même : il y a plus d'une façon de le faire (timtowtdi).

Avatar
Remi Moyen
On Tue, 18 Jan 2005, Stephane Chazelas wrote:

sed "s|^|$TOTO|" file


Ça alors... Je ne me serais jamais douté qu'on pouvait utiliser d'autres
caractères que '/' pour séparer les champs !

Mais alors, quels caractères sont utilisables ? Je n'ai aucune allusion à
cette fonctionnalité dans le man de sed. En testant un peu, ça a l'air de
marcher avec @, #, &, |, /, % et même ¤, mais pas avec une lettre
(majuscule ou minuscule, accentuée ou non) ou un chiffre.


Quelle version de sed?


Comme toi, GNU sed 4.1.2 (package Debian testing 4.1.2-8).

$ echo foo | sed 's9foo9bar9'
bar


Hum, oui, en effet. Mais pas contre, ça ne marche pas avec mon histoire de
variable :

$ export $TOTO=/tmp
$ echo foo | sed "s|^|$TOTO|"
/tmpfoo
$ echo foo | sed "s1^1$TOTO1"
sed: -e expression n°1, caractère 4: commande `s' inachevée
$ echo foo | sed "s1^1/tmp1"
/tmpfoo

Gnééé ??? Comprends plus, là... Pourquoi quand j'utilise une variable
($TOTO), ça foire si je prends un caractère alphanumérique comme
séparateur, mais que sinon (TOTO, /tmp, ...), ça marche ?

Page info:


Ah ouais. J'avoue que j'utilise pas info (trop long, et surtout je suis
pas du tout habitué à son maniement, je passe plus de temps à me battre
avec les commandes pour arriver là où je veux qu'à lire des trucs...).

C'est ce qui est à la fois amusant, pratique, mais aussi ennuyeux dans
les commandes unix : y'a toujours plusieurs manières de faire les
choses, et c'est dur (en tout cas pour moi qui n'y connait pas grand
chose !) de faire le choix entre les possibilités -- et déjà d'établir
la liste des possibilités !


D'ou un interet de laisser tomber le shell et de programmer en
perl, ruby, python et meme pourquoi pas clisp a la place.


Mouais. Le problème, c'est que pour rechercher une chaîne de caractères
dans un fichier, un grep est nettement plus rapide à taper que la même
chose en un autre langage. Après, rajouter, euh, je sais pas, un 'wc -l'
derrière, c'est encore rapide. Évidemment, quand on commence à utiliser un
sed, ou un awk, ça devient plus limite. Mais où placer exactement la
frontière ?

Pour moi qui fait majoritairement des choses très simples qui tiennent en
une ligne de commande (sauf quelques rares exceptions), je préfère avoir
un tas d'outils simples qui ont des fonctionnalités bien définies (pour
moi en tout cas), plutôt que d'apprendre un langage de plus, certes plus
puissant, mais aussi plus "flou".
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."



Avatar
Jean-Marc Bourguet
Remi Moyen writes:

On Tue, 18 Jan 2005, Stephane Chazelas wrote:

sed "s|^|$TOTO|" file


Ça alors... Je ne me serais jamais douté qu'on pouvait utiliser d'autres
caractères que '/' pour séparer les champs !

Mais alors, quels caractères sont utilisables ? Je n'ai aucune allusion à
cette fonctionnalité dans le man de sed. En testant un peu, ça a l'air de
marcher avec @, #, &, |, /, % et même ¤, mais pas avec une lettre
(majuscule ou minuscule, accentuée ou non) ou un chiffre.


Quelle version de sed?


Comme toi, GNU sed 4.1.2 (package Debian testing 4.1.2-8).

$ echo foo | sed 's9foo9bar9'
bar


Hum, oui, en effet. Mais pas contre, ça ne marche pas avec mon histoire de
variable :

$ export $TOTO=/tmp
$ echo foo | sed "s|^|$TOTO|"
/tmpfoo
$ echo foo | sed "s1^1$TOTO1"
sed: -e expression n°1, caractère 4: commande `s' inachevée
$ echo foo | sed "s1^1/tmp1"
/tmpfoo

Gnééé ??? Comprends plus, là... Pourquoi quand j'utilise une variable
($TOTO), ça foire si je prends un caractère alphanumérique comme
séparateur, mais que sinon (TOTO, /tmp, ...), ça marche ?


Il prend TOTO1 comme variable.

echo foo | sed "s1^1${TOTO}1"

devrait passer.

A+

--
Jean-Marc
Site de usenet-fr: http://www.usenet-fr.news.eu.org




Avatar
Stephane Chazelas
2005-01-18, 13:16(+01), Remi Moyen:
[...]
$ export $TOTO=/tmp
$ echo foo | sed "s|^|$TOTO|"
/tmpfoo
$ echo foo | sed "s1^1$TOTO1"
sed: -e expression n°1, caractère 4: commande `s' inachevée
$ echo foo | sed "s1^1/tmp1"
/tmpfoo
[...]


$ echo foo | sed "s1^1$TOTO1"

C'est

$ echo foo | sed "s1^1${TOTO1}"

echo foo | sed "s1^1${TOTO}1"

devrait mieux marcher.

[...]
Page info:


Ah ouais. J'avoue que j'utilise pas info (trop long, et surtout je suis
pas du tout habitué à son maniement, je passe plus de temps à me battre
avec les commandes pour arriver là où je veux qu'à lire des trucs...).


Mais c'est un gain de temps une fois qu'on a fait
l'investissement necessaire pour savoir s'en servir
efficacement.

Sinon, les pages info sont aussi disponibles en HTML ou ps.

Voir aussi pinfo, mais il lui manque les fonctionnalités les
plus interessantes d'info (index, acces direct et completion).

--
Stéphane


Avatar
FAb
Remi Moyen writes:

On Tue, 18 Jan 2005, Stephane Chazelas wrote:

sed "s|^|$TOTO|" file




$ export $TOTO=/tmp
$ echo foo | sed "s|^|$TOTO|"
/tmpfoo
$ echo foo | sed "s1^1$TOTO1"
sed: -e expression n°1, caractère 4: commande `s' inachevée
$ echo foo | sed "s1^1/tmp1"
/tmpfoo

Gnééé ??? Comprends plus, là... Pourquoi quand j'utilise une variable ($TOTO),
ça foire si je prends un caractère alphanumérique comme séparateur, mais que
sinon (TOTO, /tmp, ...), ça marche ?



$ export $TOTO="pas normal ce export"
$ export TOTO="/OK"
$ echo $TOTO1

$ export TOTO1="mince j'ai fait encore un boulette"


$ echo foo | sed "s1^1${TOTO}1"
?????
$ echo foo | sed "s2^2${TOTO1}2"
?????

Ça va mieux là ?

ah les joies du bash...


Courage,
FAb




Avatar
Remi Moyen
On Tue, 18 Jan 2005, FAb wrote:

$ export $TOTO=/tmp
$ echo foo | sed "s|^|$TOTO|"
/tmpfoo
$ echo foo | sed "s1^1$TOTO1"
sed: -e expression n°1, caractère 4: commande `s' inachevée
$ echo foo | sed "s1^1/tmp1"
/tmpfoo

Gnééé ??? Comprends plus, là... Pourquoi quand j'utilise une variable ($TOTO),
ça foire si je prends un caractère alphanumérique comme séparateur, mais que
sinon (TOTO, /tmp, ...), ça marche ?



$ export $TOTO="pas normal ce export"


Hum, oui, j'm'a planté en recopiant ce que j'avais tapé.
(ce qui n'a rien d'étonnant, je fais cette erreur encore plus souvent que
de taper 'sl' au lieu de 'ls', c'est dire...)

$ echo foo | sed "s1^1${TOTO}1"


Ach, so... Je pensais pas à ça.

Ça va mieux là ?


Oui, merci.
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."


1 2