Назад | Перейти на главную страницу

регулярное выражение: соответствует двум символам / в конце строки

У меня есть файл с путями к файлам. Глубина каталогов бывает различной длины и имени пути. Я хотел бы сопоставить два каталога назад (два /) и удалить совпадение, создав новый файл с результатами.

например:

/dir1/dir2/dir3/dir4/dir5/dir6/dir7/output_job3344.xml
/dir1/dir2/dir3/dir4/dir5/otherfile.txt

результат будет:

/dir1/dir2/dir3/dir4/dir5/dir6/
/dir1/dir2/dir3/dir4/

Я пробовал примерно так:

awk -F'/*./.*$' '{print $0}' deep.list

но это не сработало.

Ваша идея умная, но требует исправления. Вот как вы, вероятно, имели в виду:

awk -F'[^/]*/[^/]*$' '{print $1}' deep.list

Пояснение:

Во-первых, вы, вероятно, ошиблись .* так как *..

Затем * модификатор жадный, поэтому вам нужно следить за тем, чтобы он не совпадал больше, чем вы планировали! Решение простое, хотя и немного менее читаемое: используйте [^/]* вместо того .*. Таким образом вы сопоставляете любые символы, кроме /.

Наконец, $0 представляет собой всю строку, которая не была изменена ни в малейшей степени путем указания специально созданного настраиваемого разделителя полей. В этом случае вы хотите вместо этого напечатать первое поле: $1.


Вот другой подход, чем два ответы связаны @ ender.qa:

awk '{gsub("[^/]+/[^/]+$","");print}' deep.list

И один, использующий цикл:

awk -F/ '{for(i=1;i<=NF-2;i++){printf "%s/",$i}; print ""}' deep.list

Метод подстановки проще реализовать в Perl:

perl -lape 's"[^/]+/[^/]+$""' deep.list

или sed:

sed -E 's"[^/]+/[^/]+$""' deep.list