Если я вас правильно понял (см. комментарий ), GNU sed
флаг e
к команде s
может помочь вам сделать ее одной -строкой (непроверенной, извините):
sed -E 'h;s_(.*/)(.*)_grep -l \2 \1*.sh_e;x;G;s_([^/]*).sh\n_\1.sh \1 _' scriptfile
h
сохраняет строку в резервной области, чтобы мы могли восстановить ее позже, если испортим ее s_.*/_grep -l \2 \1*.sh_e
— это настоящий трюк.:.*/
соответствует всему до последней косой черты, поэтому \1
будет путем, а \2
— оставшейся частью строки (— именем скрипта ). Теперь grep -l
вставляется перед именем скрипта и перед путем; таким образом /my/path/foo.sh
становится grep -l foo.sh /my/path/*.sh
. Флаг e
выполняет этот шаблон в оболочке, поэтому он заменяется списком файлов *.sh
в /my/path
, которые содержат foo.sh
(, надеюсь, только один, в противном случае скрипт необходимо адаптировать)x
измените оба буфера и добавьте буфер хранения (теперь с ответом оболочки )на шаблон s_([^/]*).sh\n_\1.sh \1 _
выполняет очистку, дублирует имя сценария (без.sh
)и удаляет новую строку,поэтому вы должны получить желаемый результат