Удалить путь и расширение к файлу и оставить только имя файла

Если вы хотите упорядочить только по второму столбцу, вы можете попробовать это (с GNUsed):

sed -E 's/ ([0-9]{1}$)/ 0\1/' file | sort -u -k2,2n

Выход:

male 01
female 04
male 09
male 11
female 13
male 14
1
03.11.2020, 19:14
2 ответа
basename /reallylongpath/example/longername.vb |cut -d"." -f1

РЕДАКТИРОВАТЬ :это не удастся в случае '.' в имени файла. Однако

basename /reallylongpath/example/lo.ngername.vb |rev| cut -d"." -f2- |rev

предоставит вам правильный

lo.ngername
0
18.03.2021, 22:53

Для фиксированного расширения можно использовать утилиту basename:

$ f=/home/test/domain/example.txt
$ basename -- "$f".txt
example

Но так как у вас есть произвольные расширения, вам нужно явно выбрать последнее расширение для перехода к basename. Здесь можно использовать расширения параметров оболочки:

$ basename -- "$f" ".${f##*.}"
example

Или, пока мы этим занимаемся, используйте расширения параметров для обоих удалений.

$ x="${f##*/}"; x="${x%.*}"; echo "$x"
example

${var##pattern}принимает varс удалением самого длинного соответствия префикса pattern. С %%вместо этого используется суффикс, а с одним #или %— кратчайший префикс или суффикс.

Если вы считаете, что нужно удалить что-то вроде .txt.gzодинарного расширения, вместо этого вы можете использоватьx="${x%%.*}"(с двойным %%).

Обратите внимание, что последнее решение выдаст пустую строку в качестве вывода, если данный путь заканчивается на /, в то время как basenameбудет игнорировать конечные косые черты. Другой случай, требующий внимания, — это когда имена каталогов также могут содержать точки, например /home/test/domain.orig/example.txt.gz, или когда имя файла вообще не содержит точек. (Я не перепроверял все эти случаи.)

Для обсуждения связанных вопросов см.:

2
18.03.2021, 22:53

Теги

Похожие вопросы