Нет необходимости объединять egrep и sed поскольку обе команды будут искать совпадения в файлах и либо выводить результаты (egrep), либо воздействовать на них (sed), так что будет делать только sed . Но для понимания того, почему ваша линия не сработала, я пойду с вашим примером:
Обычный вывод egrep имеет форму filename:matching_line при запуске в нескольких файлах и matching_line при запуске в одном файле, в то время как sed ожидает только имена файлов. Чтобы подавить обычный вывод egrep и печатать только имена файлов, которые содержат совпадения, используйте параметр -l .
Кроме того, вам не нужен пробел в списке символов ([...]), иначе он будет слишком жадным и будет соответствовать более чем одному слову. Линия, которая будет работать:
$ egrep -l '[b-su-z]+_[0-9]+$' sst_piso_top_c0.spf_typ_C | xargs sed -ri 's/[b-su-z]+_([0-9])+$/\\<\1>/g'
Если составная команда не работает, обычно рекомендуется запускать отдельные части самостоятельно и проверять их результаты. Кроме того, сообщения об ошибках, такие как "Нет такого файла", обычно указывают вам правильное направление (и было бы неплохо включить их в ваш отчет здесь).
Наконец, как указано выше, объединение egrep и sed не имеет смысла. Разумная линия будет
$ sed -ri 's/[b-su-z]+_([0-9])+$/\\<\1>/g' sst_piso_top_c0.spf_typ_C
Обновление: в моем регулярном выражении была опечатка, которую я исправил. Я также включил обратную ссылку на номера в матче, который изначально был включен zuazo. Из комментариев, которые вы сейчас написали, кажется более ясным, что вы не хотите заменять полное совпадение статическим выражением \<23> как я это сначала понял, но вы хотите, чтобы совпадающее число отображалось в угловых скобках ...