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

cela devrait être facile: je veux lancer sed contre une chaîne littérale, pas un fichier d'entrée. Si vous vous demandez pourquoi, c'est par exemple pour éditer des valeurs stockées dans des variables, 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 s'il pensait que A,B,C est un dossier.

j'ai essayé de la tuyauterie à l'écho:

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

j'ai une invite.

Quelle est la bonne façon de le faire?

63
demandé sur amphibient 2012-10-24 22:58:03

3 réponses

vous avez un conflit de guillemets simples, alors utilisez:

 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 pas

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

parce que sed s'attendre à de fichier(s) argument(s)

MODIFIER :

si vous utilisez ou tout autre :

echo string | sed ...
94
répondu Gilles Quenot 2014-01-07 16:57:24

fonctionne comme vous voulez:

echo "A,B,C" | sed s/,/\',\'/g
7
répondu ferrants 2012-10-24 19:01:21

ma version utilisant des variables dans un script bash:

remplacer par des barres obliques rétrogrades:

input="This has a backslash \"

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

echo "$output"
3
répondu phyatt 2016-06-07 14:57:32