Comment obtenir sed pour lire à partir de l'entrée standard? [dupliquer]

91

j'essaie

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'

et obtenir

unknown option to `s'

Qu'est-ce que je fais mal?

Éditer:

Selon les commentaires, le code est en fait correct. Mon code complet ressemblait à quelque chose comme ce qui suit

grep searchterm myfile.csv | sed 's/replaceme/withthis/g'
# my comment

Et il semble que pour une raison quelconque, mon commentaire a été introduit comme entrée dans sed. Très étrange.

deltanovembre
la source
Voulez-vous remplacer votre fichier par «withthis» à la place de replacename?
Teja
2
Non, ce n'est pas ce que vous essayez. Il manque autre chose.
Ignacio Vazquez-Abrams
6
Ma meilleure hypothèse est que dans votre cas réel, vous avez un /in replacemeou withthis. Essayez: 's#replaceme#withthis#g'.
cababunga
4
Une chose que vous faites mal est de ne pas nous montrer exactement ce que vous exécutez. Le code que vous montrez est correct; vous avez un problème avec ce que vous exécutez; ergo, vous ne nous montrez pas ce que vous exécutez. Nous ne pouvons pas déboguer ce que nous ne pouvons pas voir, la plupart du temps. Parfois, nous aurons de la chance et devinerons bien, mais nous ne devrions pas avoir à deviner ou avoir de la chance.
Jonathan Leffler
1
Utilisation inutile de grep. Avec sed, vous pouvez faire: sed '/ searchterm / s / pattern / replacement / g' myfile.csv
William Pursell

Réponses:

120

utilisez l'option --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'
Ben Davis
la source
+ SOaddict, Ceci est juste une sortie vers stdout, cela ne change pas le myfile.csv.
Josiah
1
Si vous souhaitez effectuer une mise à jour sur place du fichier, je pense que ma réponse résout correctement ce problème.
Wes
Tout ce qui ressemble grep 'x' y | sed 'z'peut être remanié sed '/x/z' y. Voir aussi utilisation inutile de grep.
tripleee le
39

utilisez "-e" pour spécifier l'expression sed

cat input.txt | sed -e 's/foo/bar/g'
umläute
la source
1
Je me demandais comment utiliser "-e" pour spécifier l'expression sed peut obtenir sed pour lire à partir de stdin? Est-ce que sed par défaut lit depuis stdin?
Tim
1
Oui. comme la plupart des outils un * x, sedlit depuis stdin si aucun fichier d'entrée n'est présent.
umläute
Merci. est -enécessaire? Cela fonctionne sans -e. Je me demande quel est le but de l'utilisation -e? Merci.
Tim
2
Je ne suis pas sûr de comprendre la question d’OP. echo foo | sed 's/foo/bar/g'fonctionne sans -e, en sortant bar. J'ai donc dû manquer sa question.
Tim
Il n'est pas nécessaire de spécifier -esi vous n'avez qu'une seule instruction de script. Si vous en avez deux, vous pouvez dire sed -e '/foo/!d' -e 's//bar/g'ou sed 's/foo!d;s//bar/g'(ou de manière équivalente, avec une nouvelle ligne au lieu d'un point-virgule).
tripleee le
6

Pour faire une sedcapture depuis stdin, au lieu d'un fichier, vous devez utiliser -e.

Comme ça:

curl -k -u admin:admin https://$HOSTNAME:9070/api/tm/3.8/status/$HOSTNAME/statistics/traffic_ips/trafc_ip/ | sed -e 's/["{}]//g' |sed -e 's/[]]//g' |sed -e 's/[\[]//g' |awk  'BEGIN{FS=":"} {print $4}'
LeoChu
la source
2

Si vous essayez de faire une mise à jour sur place du texte dans un fichier, c'est beaucoup plus facile à raisonner dans mon esprit.

grep -Rl text_to_find directory_to_search 2>/dev/null | while read line; do  sed -i 's/text_to_find/replacement_text/g' $line; done

Nous s
la source
-16
  1. Ouvrez le fichier en utilisant vi myfile.csv
  2. presse Escape
  3. Type :%s/replaceme/withthis/
  4. Tapez :wqet appuyez surEnter

Vous aurez maintenant le nouveau modèle dans votre fichier.

Teja
la source
11
OP voulait savoir comment le faire avec sed, pas avec vim.
Noe Nieto
1
Ce que Noe a dit. De plus, votre solution vim est inférieure aux alternatives sed car elle n'est pas (facilement) scriptable.
weberc2