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

92

Cela devrait être simple: je veux exécuter sed sur une chaîne littérale, pas sur un fichier d'entrée. Si vous vous demandez pourquoi, il s'agit, par exemple, de modifier les valeurs stockées dans des variables, pas nécessairement des données textuelles.

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 s'il 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 procéder?

amphibie
la source

Réponses:

149

Vous avez un conflit entre guillemets simples, utilisez donc:

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

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

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

mais non

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

car sedattendez le (s) fichier (s) comme argument (s)

MODIFIER :

si tu utilises ou tout autre:

echo string | sed ...
Gilles Quenot
la source
1
étrange, ne fonctionne pas pour moi ... réalisant que cela a été publié il y a quelque temps, mais étrange dépréciation si c'est le problème
super
10

Fonctionne comme vous le souhaitez:

echo "A,B,C" | sed s/,/\',\'/g
ferrants
la source
5

Ma version utilisant des variables dans un script bash:

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

input="This has a backslash \\"

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

echo "$output"
phyatt
la source