Jak uzyskać odczyt seda ze standardowego wejścia? [duplikować]

91

próbuję

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

i coraz

unknown option to `s'

Co ja robię źle?

Edytować:

Zgodnie z komentarzami kod jest faktycznie poprawny. Mój pełny kod był podobny do następującego

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

Wygląda na to, że z jakiegoś powodu mój komentarz był wprowadzany do seda. Bardzo dziwny.

deltanovember
źródło
Czy chcesz zamienić swój plik na „withthis” zamiast nazwy zastępczej?
Teja
2
Nie, nie tego próbujesz. Brakuje czegoś innego.
Ignacio Vazquez-Abrams
6
Domyślam się, że w twoim prawdziwym przypadku masz /in replacemelub withthis. Spróbuj: 's#replaceme#withthis#g'.
cababunga
4
Jedną z rzeczy, które robisz źle, jest to, że nie pokazujesz nam dokładnie tego, co wykonujesz. Kod, który pokazujesz, jest w porządku; masz problem z tym, co wykonujesz; ergo, nie pokazujesz nam, co wykonujesz. Przez większość czasu nie możemy debugować tego, czego nie widzimy. Czasami będziemy mieli szczęście i zgadujemy dobrze, ale nie powinniśmy zgadywać ani mieć szczęścia.
Jonathan Leffler
1
Bezużyteczne użycie grep. Z sedem możesz zrobić: sed '/ searchterm / s / pattern / replace / g' myfile.csv
William Pursell

Odpowiedzi:

120

użyj opcji --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'
Ben Davis
źródło
+ SOaddict, to tylko wyjście na stdout, nie zmienia myfile.csv.
Josiah,
1
Jeśli chcesz przeprowadzić aktualizację pliku na miejscu, myślę, że moja odpowiedź odpowiednio rozwiązuje ten problem.
Wes
Wszystko, co wygląda, grep 'x' y | sed 'z'można poddać refaktoryzacji sed '/x/z' y. Zobacz także bezużyteczne użycie grep.
tripleee
39

użyj "-e", aby określić wyrażenie sed

cat input.txt | sed -e 's/foo/bar/g'
umläute
źródło
1
Zastanawiałem się, w jaki sposób użycie "-e" do określenia wyrażenia sed może spowodować odczytanie seda ze standardowego wejścia? Czy sed domyślnie czyta ze stdin?
Tim
1
tak. jak większość narzędzi un * x, sedczyta ze standardowego wejścia, jeśli nie ma pliku wejściowego.
umläute
Dzięki. jest -ekonieczne? Działa bez -e. Zastanawiam się, jaki jest cel używania -e? Dzięki.
Tim
2
Nie jestem pewien, czy rozumiem kwestię OP. echo foo | sed 's/foo/bar/g'działa bez -e, wyprowadzając bar. Więc musiałem przegapić jego pytanie.
Tim
Nie ma potrzeby określania, -eczy masz tylko jedną instrukcję skryptu. Jeśli masz dwa, możesz powiedzieć sed -e '/foo/!d' -e 's//bar/g'lub sed 's/foo!d;s//bar/g'(lub równoważnie, z nową linią zamiast średnika).
tripleee
6

Aby sedzłapać ze stdin, zamiast z pliku, powinieneś użyć -e.

Lubię to:

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
źródło
2

Jeśli próbujesz wykonać aktualizację na miejscu tekstu w pliku, o wiele łatwiej jest mi to zrozumieć.

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

Wes
źródło
-16
  1. Otwórz plik za pomocą vi myfile.csv
  2. naciśnij Escape
  3. Rodzaj :%s/replaceme/withthis/
  4. Wpisz :wqi naciśnijEnter

Teraz będziesz mieć nowy wzór w swoim pliku.

Teja
źródło
11
OP chciał wiedzieć, jak to zrobić z sedem, a nie z vimem.
Noe Nieto
1
Co powiedział Noe. Ponadto, twoje rozwiązanie vim jest gorsze od alternatyw seda, ponieważ nie jest (łatwo) skryptowalne.
weberc2