Есть ли вариант использования `sed -n "/regexp/p" `в мире, где существует grep?

команда

sed "/AdminList/s/abc1\@abc\.com,//g"  filename

вход

JFR=abc1@abc.com,abc2@abc.com
UserListApp1=abc1@abc.com,abc2@abc.com
UserListApp2=abc1@abc.com
AdminList=abc1@abc.com,abc2@abc.com,abc3@abc.com,abc4@abc.com
GlobalList=abc1@abc.com

выход

JFR=abc1@abc.com,abc2@abc.com
UserListApp1=abc1@abc.com,abc2@abc.com
UserListApp2=abc1@abc.com
AdminList=,abc2@abc.com,abc3@abc.com,abc4@abc.com
GlobalList=abc1@abc.com
1
17.04.2020, 23:13
2 ответа

Обратите внимание на размер:

$ ls -lh /bin/grep /bin/sed
-rwxr-xr-x 1 root root 207K Apr 29  2016 /bin/grep
-rwxr-xr-x 1 root root  72K Feb 11  2016 /bin/sed
$

grepиспользует больше памяти, чемsed

А время выполнения (реальное):

$ time date | grep Apr
Fri Apr 17 13:31:11 PDT 2020

real    0m0.035s
user    0m0.000s
sys     0m0.016s
$ time date | sed -n '/Apr/p'
Fri Apr 17 13:31:29 PDT 2020

real    0m0.028s
user    0m0.000s
sys     0m0.016s
$

Видите, как sedнемного быстрее?

Во встроенной среде с ограниченными ресурсами это может иметь значение.

1
19.03.2021, 02:28

Командаsed -n '/re/p'(или sed '/re/!d'без использования -nдля подавления вывода по умолчанию в конце каждого цикла )идентична grep -e 're', и обе можно проследить до ed. команда редактора g/re/p("глобально сопоставить reи распечатать" ); использование sedи grepтаким базовым способом похоже на запуск команды gнад текстом в ed.

Если все, что вы хотите сделать, это напечатать строки, соответствующие определенному регулярному выражению, используйте grep. Вот что делает grep. Это его основная задача. Если бы для этой задачи вы использовали grep, а не sed, ваш шелл-код стал бы чище, проще для понимания и обслуживания.

Используйте /re/pв sed, если это часть более длинного sedсценария редактирования. Не передавайте grepв sedили наоборот, если только у вас нет каких-то действительно особых и причудливых требований.

Обратите внимание, что /re/в команде sed— это адрес . Он обращается ко всем строкам, которые соответствуют конкретному регулярному выражению.С /re/pон печатает эти строки. Другими словами, /re/— это адрес для команды p.

Адреса также могут быть номерами строк или диапазоном, описываемым двумя номерами строк, двумя регулярными выражениями или их комбинацией. Таким образом, вы могли бы, например, использовать sed -n '5,/re/p'для печати всех строк от строки 5 до любой строки, соответствующей re. Такой возможности нет у утилиты grep, которая sedунаследовала от редактора ed.

Подводя итог,:grepявляется более подходящим инструментом для простого извлечения строк, соответствующих конкретному регулярному выражению. Чтобы извлечь строки, соответствующие более сложным критериям (, например. в некотором диапазоне )используйте sedили awk.

3
19.03.2021, 02:28

Теги

Похожие вопросы