Большой Воронежский Форум
» UNIX и дериваты>Вопросик по bash
distantX 14:16 10.02.2006
Хочу написать один bash-скриптец, да затык вышел. Подскажите, кто знает, пожалуйста!
Надо из полного пути к файлу (один из аргументов скрипта) выкусить имя без расширения.
Про basename в курсе, но как от расширения избавиться - не соображу. [Ответ]
nickvgru 14:40 10.02.2006
Это можно сделать с помощью команды gawk.
Читайте man gawk. Или пришлите строку и что из нее нужно извлечь [Ответ]
distantX 14:57 10.02.2006
nickvgru,

О, как быстро ответили, спасибо

есть какой-нибудь путь вида:
/Volumes/Media/бла-бла.../DJinfo.txt (возможно, *.log) или
/mnt/бла-бла.../DJinfo.txt

Так вот, это самое DJinfo в качестве строки мне и надо получить.

PS.
man по gawk зачту вечером в любом случае.
[Ответ]
nickvgru 07:34 13.02.2006
В скритпе нужно задать переменную например:
path_to_the_files=/Volumes/Media/бла-бла...
Затем переходим в соответствующий каталог
cd $path_to_the_files
Затем получаем список файлов в нужном виде (то есть без точки)
ls | gawk -F '.' '{print $1}' [Ответ]
distantX 11:51 13.02.2006
nickvgru,
СПА-СИ-БА! :-) [Ответ]
maximk 08:49 14.02.2006
Если уж вспоминать bash, то там есть такие фишки:

- оставить только последний элемент пути
P="${P##/*/}"
- удалить расширение
P="${P%%.*}"

(P это переменная изначально содержащая полный путь и имя файла, а в конце - имя файла без расширения) [Ответ]
distantX 10:17 14.02.2006
nickvgru, maximk,
Поскольку gawk есть не во всех системах, а первый параметр скрипта ($1) у меня изначально содержит полный путь и имя файла, вчера сделал так:

basename $1 |awk -F '.' '{print $1}'

PS. Спасибо, maximk, за Ваш компактный способ. [Ответ]
yuridichesky 21:16 14.02.2006
чтобы отсечь именно расширение:

basename $1 | sed 's/\.[^.]*$//'

например:
my.very.important.file.txt -> my.very.important.file [Ответ]
yuridichesky 21:46 14.02.2006
или один sed:

echo $1 | sed 's:^.*/::; s:\.[^.]*$::' [Ответ]
distantX 15:25 15.02.2006
yuridichesky,
люто! По функциональности:"отсечь именно расширение" - идеально.
Спасибо.

PS. Я еще зеленый. Вот так навскидку даже проанализировать такую строку не могу.
man sed набирать мне еще рано: только-только в awk въезжаю [Ответ]
yuridichesky 12:55 16.02.2006

Сообщение от distantX:
yuridichesky,
люто! По функциональности:"отсечь именно расширение" - идеально.
Спасибо.

PS. Я еще зеленый. Вот так навскидку даже проанализировать такую строку не могу.
man sed набирать мне еще рано: только-только в awk въезжаю

Да не за что, рад, что помог.

А делает оно вот что.
s:^.*/::
s -- substitute, т.е. заменить. s:что_меняем:на_что_меняем:, или s/что_меняем/на_что_меняем/

Итак, что меняем: от начала строки (^) любые символы (.*), заканчивающиеся '/' (/). На что меняем? На пусто.
Потом продолжаем обработку строки: s:\.[^.]*$::, т.е. меняем точку (\.), за которой следуют любые символы, кроме точки ([^.]*), которые завершаются концом строки ($) на пусто.

Легко! [Ответ]
Вверх