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.


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'

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

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

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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.