Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/10/2015, à 21:21

sergeG75018

proteger caracteres spéciaux dans une boucke while avec sed.

Bonjour c'est encore moi.
Aujourd'hui mon souci est que je n'arrive pas a faire prendre en charge les caractères  spéciaux par sed.
exemple: dans ce cas je suis obligé de "double quoter" mes variable pour qu'elles agissent comme je veux et ça marche, mais il n'y a pas de caractères spéciaux.

man sed > "$HOME/sed.txt"
grep -i ^[a-z] "$HOME/sed.txt" | while read line ; do
    echo "$line"
    sed -i 's/'"^$line"'/quelquechose'"$line"'autrechose/g' "$HOME/sed.txt"
done

maintenant on cherche des caractères spéciaux et là ça marche plus ils ne sont pas protégés.

man sed > "$HOME/sed.txt"
grep -i "//" "$HOME/sed.txt" | while read line ; do
    echo "$line"
    sed -i 's/'"$line"'/quelquechose'"$line"'autrechose/g' "$HOME/sed.txt"
done

Ça fait un bon moment que je suis là-dessus et un peu d'aide ne sera pas de refus .
Merci.

Dernière modification par sergeG75018 (Le 31/10/2015, à 21:23)


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#2 Le 31/10/2015, à 22:27

pingouinux

Re : proteger caracteres spéciaux dans une boucke while avec sed.

Bonsoir,
Tu te compliques bien la vie…
Ce que tu fais, c'est de lire une première fois le fichier pour récupérer les lignes qui t'intéressent, et tu le relis pour chaque ligne trouvée. Ce n'est pas efficace.
Essaye ceci :

man sed > "$HOME/sed.txt"
sed -ri '/^[a-zA-Z]/s/(.*)/quelquechose\1autrechose/' "$HOME/sed.txt"
man sed > "$HOME/sed.txt"
sed -ri '\#//#s/(.*)/quelquechose\1autrechose/' "$HOME/sed.txt

Édité :
On peut même traiter les deux expressions en même temps

sed -ri '\#^[a-zA-Z]|//#s/(.*)/quelquechose\1autrechose/' "/$HOME/sed.txt"

Remarque :
Pour remplacer une chaîne avec sed, tu peux utiliser n'importe quel séparateur. Par exemple, pour remplacer // par mes_2_slash

sed 's#//#mes_2_slash#g' fichier

Dernière modification par pingouinux (Le 01/11/2015, à 06:10)

Hors ligne

#3 Le 04/11/2015, à 09:49

sergeG75018

Re : proteger caracteres spéciaux dans une boucke while avec sed.

Bonjour.
Désolé pour le retard problème d'internet.
Il y-a beaucoup de choses que je ne comprend pas et ce que je vais écrire va peut-être paraître idiot à certain.
dans cette ligne:

sed -ri '/^[a-zA-Z]/s/(.*)/quelquechose\1autrechose/' "$HOME/sed.txt"

(.*) dépend bien du shell et doit renvoyer soit la valeur 0 soit 1
si oui pourquoi les 2 ont elles le même résultat?

mea culpa:Je ne connaissais pas info qui est beaucoup plus complet que man.
Merci.


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#4 Le 04/11/2015, à 10:06

pingouinux

Re : proteger caracteres spéciaux dans une boucke while avec sed.

(.*) dépend bien du shell et doit renvoyer soit la valeur 0 soit 1

.* : C'est la ligne complète. Les parenthèses permettent de l'insérer dans le champ de remplacement avec \1 (1er groupe de parenthèses)

si oui pourquoi les 2 ont elles le même résultat?

De quelles 2 parles-tu ?

Hors ligne

#5 Le 04/11/2015, à 10:24

sergeG75018

Re : proteger caracteres spéciaux dans une boucke while avec sed.

Et bien que je mettes \0 ou \1 j'ai le même résultat.


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne

#6 Le 04/11/2015, à 10:48

pingouinux

Re : proteger caracteres spéciaux dans une boucke while avec sed.

Oui, ici c'est la même chose (\0 représente la portion de la ligne correspondant à l'expression régulière). Voici un exemple où c'est différent :

$ sed -r 's/((AA).*(BB)).*/ 0=\0= 1=\1= 2=\2= 3=\3=/' <<<"débutAAAmilieuBBBfin"
début 0=AAAmilieuBBBfin= 1=AAAmilieuBBB= 2=AA= 3=BB=

\1, \2, \3 correspondent aux numéros des parenthèses ouvrantes.

Hors ligne

#7 Le 04/11/2015, à 13:46

sergeG75018

Re : proteger caracteres spéciaux dans une boucke while avec sed.

OK et comme au début il n'y a rien il apparaît en dehors du résultat
merci à toi


Ironie, sarcasme ou cynisme? Je ne sais plus

Hors ligne