Wie kann ich von der Standardeingabe lesen?

89

ich versuche

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

und bekommen

unknown option to `s'

Was mache ich falsch?

Bearbeiten:

Gemäß den Kommentaren ist der Code tatsächlich korrekt. Mein vollständiger Code ähnelte ungefähr dem folgenden

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

Und es scheint, dass aus irgendeinem Grund mein Kommentar als Eingabe in sed eingespeist wurde. Sehr eigenartig.

deltanovember
quelle
Möchten Sie Ihre Datei anstelle des Ersatznamens durch "withthis" ersetzen?
Teja
2
Nein, das versuchst du nicht. Es fehlt noch etwas.
Ignacio Vazquez-Abrams
6
Meine beste Vermutung ist, dass Sie in Ihrem realen Fall ein /In replacemeoder haben withthis. Versuchen Sie : 's#replaceme#withthis#g'.
Cababunga
4
Eine Sache, die Sie falsch machen, ist, uns nicht genau zu zeigen, was Sie ausführen. Der Code, den Sie anzeigen, ist in Ordnung. Sie haben ein Problem mit dem, was Sie ausführen. Ergo zeigen Sie uns nicht, was Sie ausführen. Wir können die meiste Zeit nicht debuggen, was wir nicht sehen können. Manchmal haben wir Glück und raten richtig, aber wir sollten nicht raten oder Glück haben müssen.
Jonathan Leffler
1
Nutzlose Verwendung von grep. Mit sed können Sie Folgendes tun: sed '/ searchterm / s / pattern / replace / g' myfile.csv
William Pursell

Antworten:

117

Verwenden Sie die Option --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'
Ben Davis
quelle
+ SOaddict, Dies wird nur in stdout ausgegeben, es ändert nicht die Datei myfile.csv.
Josiah
1
Wenn Sie eine direkte Aktualisierung der Datei durchführen möchten, kann dieses Problem meiner Meinung nach durch meine Antwort angemessen gelöst werden.
Wes
37

Verwenden Sie "-e", um den sed-Ausdruck anzugeben

cat input.txt | sed -e 's/foo/bar/g'
umläute
quelle
1
Ich habe mich gefragt, wie die Verwendung von "-e" zur Angabe des sed-Ausdrucks dazu führen kann, dass sed von stdin gelesen wird. Liest sed standardmäßig von stdin?
Tim
1
Ja. sedliest wie die meisten un * x-Tools aus stdin, wenn keine Eingabedatei vorhanden ist.
Umläute
Vielen Dank. ist -enotwendig? Es funktioniert ohne -e. Ich frage mich, was der Zweck der Verwendung ist -e. Vielen Dank.
Tim
2
Ich bin nicht sicher, ob ich die Frage des OP verstehe. echo foo | sed 's/foo/bar/g'funktioniert ohne -e, durch Ausgabe bar. Also muss ich seine Frage verpasst haben.
Tim
6

Um sedaus stdin anstatt aus einer Datei zu fangen, sollten Sie verwenden -e.

So was:

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
quelle
1

Wenn Sie versuchen, eine direkte Aktualisierung des Textes in einer Datei durchzuführen, ist dies in meinen Augen viel einfacher zu begründen.

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
Wir s
quelle
-15
  1. Öffnen Sie die Datei mit vi myfile.csv
  2. Drücken Sie Escape
  3. Art :%s/replaceme/withthis/
  4. Geben Sie ein :wqund drücken SieEnter

Jetzt haben Sie das neue Muster in Ihrer Datei.

Teja
quelle
11
OP wollte wissen, wie man es mit sed macht, nicht mit vim.
Noe Nieto
1
Was Noe gesagt hat. Außerdem ist Ihre vim-Lösung den sed-Alternativen unterlegen, da sie nicht (einfach) skriptfähig ist.
weberc2