web-dev-qa-db-fra.com

sed avec chaîne littérale - pas de fichier d'entrée

Cela devrait être facile: je veux exécuter sed contre une chaîne littérale, pas un fichier d'entrée. Si vous vous demandez pourquoi, vous devez par exemple modifier des valeurs stockées dans des variables, mais pas nécessairement des données de texte.

Quand je fais:

sed 's/,/','/g' "A,B,C"

où A, B, C est le littéral que je veux changer en A ',' B ',' C

Je reçois

Can't open A,B,C

Comme si on pensait que A, B, C était un fichier.

J'ai essayé de le mettre en écho:

echo "A,B,C" | sed 's/,/','/g' 

Je reçois une invite.

Quelle est la bonne façon de le faire?

70
amphibient

Vous avez un seul conflit entre guillemets, utilisez donc:

 echo "A,B,C" | sed "s/,/','/g"

Si vous utilisez bash , vous pouvez aussi le faire (<<< est un here-string):

sed "s/,/','/g" <<< "A,B,C"

mais non

sed "s/,/','/g"  "A,B,C"

parce que sed attend le (s) fichier (s) en tant qu'argument (s)

[~ # ~] éditer [~ # ~] :

si vous utilisez ksh ou d’autres:

echo string | sed ...
119
Gilles Quenot

Fonctionne comme vous le souhaitez:

echo "A,B,C" | sed s/,/\',\'/g
9
ferrants

Ma version utilisant des variables dans un script bash:

Recherchez les barres obliques inverses et remplacez-les par des barres obliques:

input="This has a backslash \\"

output=$(echo "$input" | sed 's,\\,/,g')

echo "$output"
4
phyatt