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.


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'

+ 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'

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}'

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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.