Як змусити читати 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?
Тея

2
Ні, це не те, що ти намагаєшся. Ще чогось не вистачає.
Ігнасіо Васкес-Абрамс,

6
Моє припущення, що в вашому реальному випадку ви маєте /в replacemeабо withthis. Спробуйте: 's#replaceme#withthis#g'.
кабабунга

4
Одне, що ви робите неправильно, - це не те, щоб показати нам, що саме ви виконуєте. Код, який ви показуєте, чудовий; у вас проблема з тим, що ви виконуєте; ерго, ви не показуєте нам, що ви виконуєте. Здебільшого ми не можемо налагодити те, чого не бачимо. Іноді нам пощастить і вгадаємо правильно, але нам не повинно бути потрібно гадати чи пощастити.
Джонатан Леффлер,

1
Марно використання grep. За допомогою sed ви можете зробити: sed '/ searchterm / s / pattern / replacement / g' myfile.csv
William Pursell,

Відповіді:


120

використовуйте параметр --expression

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

+ SOaddict, це просто вихід у stdout, це не змінює myfile.csv.
Джосія

1
Якщо ви хочете оновити файл на місці, я думаю, що моя відповідь адекватно вирішує цю проблему.
Вес,

Все, що схоже, grep 'x' y | sed 'z'може бути реконструйовано sed '/x/z' y. Див. Також марне використання grep.
триплеє

39

використовуйте "-e", щоб вказати вираз sed

cat input.txt | sed -e 's/foo/bar/g'

1
Мені було цікаво, як за допомогою "-e" для вказівки виразу sed можна змусити sed читати з stdin? Чи за замовчуванням 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'(або еквівалентно, з новим рядком замість крапки з комою).
триплеє

6

Щоб зробити sedcatch з 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}'

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


-16
  1. Відкрийте файл за допомогою vi myfile.csv
  2. Натисніть Escape
  3. Тип :%s/replaceme/withthis/
  4. Наберіть :wqі натиснітьEnter

Тепер у вашому файлі буде новий шаблон.


11
OP хотів знати, як це зробити з sed, а не з vim.
Noe Nieto

1
Те, що сказав Ное. Крім того, ваше рішення vim поступається альтернативам sed, оскільки воно не легко (легко) для написання.
weberc2
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.