регулярное выражение для удаления путей из имен файлов, но только если путь начинается с заданного шаблона


У меня есть файл, содержащий имена файлов (среди прочего). Только некоторые имена файлов находятся в начале строки в файле:

~/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 2

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