команда
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
Обратите внимание на размер:
$ 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
немного быстрее?
Во встроенной среде с ограниченными ресурсами это может иметь значение.
Команда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
.