Нет необходимости объединять 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>
как я это сначала понял, но вы хотите, чтобы совпадающее число отображалось в угловых скобках ...