регулярное выражение для удаления путей из имен файлов, но только если путь начинается с заданного шаблона
У меня есть файл, содержащий имена файлов (среди прочего). Только некоторые имена файлов находятся в начале строки в файле:
~/remove/me/myexec.pl /some/other/path/exec.pl
/yet/another/path/pipeit.pl | ~/remove/me/subdir/tome.pl
~/remove/me/deeply/nested/exec.pl
Я хочу удалить путь к файлу любого файла, который начинается с ~/remove/me
. Я также хочу, чтобы все подкаталоги ~/remove/me
были удалены.
Вот мой желаемый вывод из вышесказанного:
myexec.pl /some/other/path/exec.pl
/yet/another/path/pipeit.pl | tome.pl
exec.pl
Пути файлов, не начинающиеся с ~/remove/me
, должны быть оставлены в покое.
Самое близкое, что я могу получить, это использовать регулярное выражение типа это:
s{~/remove/me/[^/]*?}{}gxms
Но это не имеет отношения к подкаталогам должным образом, давая мне следующий вывод:
myexec.pl /some/other/path/exec.pl
/yet/another/path/pipeit.pl | subdir/tome.pl
deeply/nested/exec.pl
Может ли кто-нибудь придумать регулярное выражение, чтобы решить эту проблему?
3 ответа:
Другой способ -
s{~/remove/me/(?:[^/\s]*?/)*}{}g
~/remove/me/ (?: # Optional - Many non-spaced subdir's [^/\s]*? / )*
Попробуйте это:
~\/remove\/me[^\s]*\/(?=[^\s]+)
Пояснение:
~\/remove\/me # starts with "~/remove/me" [^\s]*\/ # match any non-space till last slash "/" (?=[^\s]+) # match without taking the name and extension
Надеюсь, это поможет.
Быстрый, не идеальный, но я думаю, что он делает то, что требуется - конечно, его можно оптимизировать.
my $text = "~/remove/me/myexec.pl /some/other/path/exec.pl\n/yet/another/path/pipeit.pl | ~/remove/me/subdir/tome.pl\n~/remove/me/deeply/nested/exec.pl"; $text =~ s/~\/remove\/me[a-zA-Z0-9\/]*\/([a-zA-Z0-9.]+)/$1/g; print $text;
Приводит к следующему:
myexec.pl /some/other/path/exec.pl /yet/another/path/pipeit.pl | tome.pl exec.pl