Я работаю над шаблоном замены sed, который берет имя файла с абсолютным путем и затем печатает неизмененный ввод, а также измененный ввод (который должен применяться только к имени файла, а не к пути).Некоторый путь гарантированно определен явно, поэтому ему никогда не будет дано что-то вроде «test.c», в этом случае это будет «./test.c».
У меня есть работающее регулярное выражение, но только когда заменяемая часть находится в начале имени файла.Я хотел бы, чтобы он работал с любой частью имени файла.
Чтобы уточнить, вот краткое изложение текущего поведения.
INPUT PATTERN CURRENT OUTPUT DESIRED BEHAVIOR?
./test.c p;s;\(.*/\)t;\1###; ./test.c Yes
./###est.c
testdir/test.c p;s;\(.*/\)tes;\1#; testdir/test.c Yes
testdir/#t.c
./test.c p;s;\(.*/\)est;\1#; ./test.c NO
./test.c Should be ./t#.c
Как вы можете видеть, это мой шаблон:
p;s;\(.*/\)SubstringToFind;\1SubstringToInsert;
Вот моя логика для этого:
p
, чтобы напечатать неизмененную строку
s
для замены (да, мы все это знаем)
Захватить путь: любое количество символов плюс конечный "/"
SubstringToFind: искать шаблон где-нибудь в имени файла.
\1
: восстановить неизмененноепуть
SubstringToInsert: вставить измененное имя файла
Я уверен, что это просто вызывает одно крошечное добавление, такое как еще одно ". *", которое я пытался добавить сразу после захватаскобки, но это просто заменяет указанный шаблон вместе со всеми символами имени файла перед ним.Я уверен, что решение смотрит мне в лицо, но я не вижу его.Любая помощь от кого-то более опытного в регулярных выражениях, чем я?Спасибо!