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?

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 ...

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

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"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.