Вы можете объединить grep
в sed
следующим образом:
exec 3> >(sed -une '/^good:/s//I got: /p')
echo "bad:data1">&3
echo "good:data2">&3
Немного распаковать: Вы можете поместить регулярное выражение (как обычно, между косыми чертами) перед любой командой sed, которая делаетон применяется только к строкам, которые соответствуют этому регулярному выражению.Если первый аргумент регулярного выражения для команды s
является пустой строкой (s//whatever/
), то он будет повторно использовать последнее соответствующее регулярное выражение, которое в данном случае является префиксом, так что избавляет от необходимости повторяться.И, наконец, опция -n
заставляет sed печатать только то, что ему конкретно предписано печатать, а суффикс /p
команды s
заставляет печатать результат подстановки.
Параметр -e
не является строго обязательным, но это хороший стиль, он просто означает, что «следующим аргументом является сценарий sed, а не имя файла».
Всегда помещайте сценарии sed в одинарные кавычки, если только вам не нужно подставлять оболочкутам переменная, и даже тогда я бы поставил все , но переменную оболочки в одинарных кавычках (переменная оболочки, конечно, в двойных кавычках).Таким образом вы избежите кучу горя, связанной с обратной косой чертой.