Как заставить sed читать со стандартного ввода? [дубликат]

91

я стараюсь

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

и получение

unknown option to `s'

Что я делаю неправильно?

Редактировать:

Согласно комментариям, код действительно правильный. Мой полный код выглядел примерно так:

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

И похоже, что по какой-то причине мой комментарий был введен в sed. Очень странный.

дельтановоябрь
источник
Вы хотите заменить свой файл на 'withthis' вместо replacename?
Teja
2
Нет, это не то, что вы пытаетесь. Не хватает чего-то еще.
Игнасио Васкес-Абрамс
6
Я думаю, что в вашем реальном случае у вас есть /in replacemeили withthis. Попробуйте: 's#replaceme#withthis#g'.
cababunga
4
Одна вещь, которую вы делаете неправильно, - не показываете нам, что именно вы выполняете. Код, который вы показываете, в порядке; у вас проблема с тем, что вы выполняете; следовательно, вы не показываете нам, что выполняете. Большую часть времени мы не можем отладить то, что не видим. Иногда нам повезет и мы угадываем правильно, но нам не нужно угадывать или нам везет.
Джонатан Леффлер
1
Бесполезное использование grep. С помощью sed вы можете сделать: sed '/ searchterm / s / pattern / replacement / g' myfile.csv
Уильям Перселл

Ответы:

121

используйте параметр --expression

grep searchterm myfile.csv | sed --expression='s/replaceme/withthis/g'
Бен Дэвис
источник
+ SOaddict, это просто вывод на стандартный вывод, это не меняет myfile.csv.
Джозия
1
Если вы хотите обновить файл на месте, я думаю, что мой ответ адекватно решает эту проблему.
Уэс
Все, что выглядит, grep 'x' y | sed 'z'можно отремонтировать sed '/x/z' y. См. Также бесполезное использование grep.
tripleee
40

используйте "-e", чтобы указать выражение sed

cat input.txt | sed -e 's/foo/bar/g'
умлют
источник
1
Мне было интересно, как с помощью "-e" для указания выражения sed можно заставить sed читать из стандартного ввода? Считывает ли sed по умолчанию из stdin?
Тим
1
да. как и большинство инструментов un * x, sedчитает из stdin, если входной файл отсутствует.
umläute
Благодарю. это -eнеобходимо? Работает без -e. Интересно, с какой целью использовать -e? Благодарю.
Тим
2
Я не уверен, что понимаю вопрос OP. echo foo | sed 's/foo/bar/g'работает без -eвывода, путем вывода bar. Так что я, должно быть, пропустил его вопрос.
Тим
Нет необходимости указывать, есть -eли у вас только один оператор сценария. Если у вас их два, вы можете сказать sed -e '/foo/!d' -e 's//bar/g'или sed 's/foo!d;s//bar/g'(или, что то же самое, с новой строкой вместо точки с запятой).
tripleee
6

Чтобы sedпоймать из stdin, а не из файла, вы должны использовать-e .

Как это:

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
источник
2

Если вы пытаетесь выполнить обновление текста в файле на месте, мне гораздо проще рассуждать об этом.

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

Уэс
источник
-17
  1. Откройте файл с помощью vi myfile.csv
  2. Нажмите Escape
  3. Тип :%s/replaceme/withthis/
  4. Введите :wqи нажмитеEnter

Теперь в вашем файле будет новый узор.

Teja
источник
11
OP хотел знать, как это сделать с помощью sed, а не vim.
Ноэ Ньето
1
Что сказал Ной. Кроме того, ваше решение vim уступает альтернативе (-ам) sed, поскольку оно (легко) не поддерживает скрипты.
weberc2