У меня есть текстовый файл, который имеет следующую строку:

/u/tux/abc/spool/frtbla_mcdetc_0000149099_20101126135009990_1.tif

Я хочу извлечь frtbla_mcdetc_0000149099_20101126135009990_1.tif ; слово после последней косой черты (/).

5 ответов5

1

Если вы находитесь в Linux-подобной среде, вы можете использовать утилиту basename :

basename $(<your_file)
0

используйте эту команду

cat text_file_name | cut -d '/' -f 6
0

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

$ cut -f6 -d '/' file.txt

Здесь используется cut для обработки разделителей каталогов как разделителя и извлечения шестого.

Если вместо этого вам известно только то, что это последняя часть строки, но вы не знаете структуру каталогов, вы также можете использовать rev :

$ rev file.txt | cut -f1 -d '/' | rev

Здесь файл переворачивается, и первое поле извлекается перед повторным обращением.

0

Следующее применимо ко всем строкам в оболочке, а не только к именам файлов, и это гораздо проще, чем вырезать, потому что вам не нужно знать, сколько есть полей перед тем, которое вы хотите:

$ foo=/path/to/file/split/by/slashes.txt
$ echo ${foo##*/}
slashes.txt

При этом используется «жадная обрезка», то есть обрезка всего до последнего «/», как описано здесь:

https://stackoverflow.com/questions/3162385/how-to-split-a-string-in-shell-and-get-the-last-field

${foo  <-- from variable foo
  ##   <-- greedy front trim
  *    <-- matches anything
  /    <-- until the last '/'
 }
0

Я не знаю, что такое стандартная оболочка в Aix, но bash доступен и поддерживает отредактированное расширение переменных.

Если ваше полное имя находится в переменной FileName , то ${FileName##*/} отображает имя со всеми старшими символами, удаленными до последнего / ; напротив, ${FileName#*/} удаляет до первого / , а ${FileName%/*} удаляет завершающие символы из последнего / (т. е. путь к каталогу).

Если вы генерируете имена файлов с помощью команды find , то вам нужна команда, подобная следующей:

find ... | while read FileName; do echo ${FileName##*/}; done

Если в текстовом файле:

while read FileName; do echo ${FileName##*/}; done < FileList.txt

Замените команду echo любой обработкой, которую вам нужно сделать с именем.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .