Возникла потребность отделить от имени deb-пакета его окончание - ".deb",
а само имя имеет вид name_ver1+debver2_amd64.deb.
Я пытался сделать это с помощьюawk, задавая разделитель как ".deb", как '.deb' и как "\.deb"
и выводя 1-е поле, в 3-м случае получаю сообщение, что '.' трактуется как plain, но всё равно
выводится то, что перед "+deb", как если бы и задавал разделитель "+deb".
Пытался и отдельно задвать FS="\.deb", всё равно.
Как получить желаемое?
Peter, А чем sed не устроил??
[console] linux-gsu4:/home/dcrp # ls *deb name_ver1+debver2_amd64.deb name_ver2+debver3_amd64.deb
linux-gsu4:/home/dcrp # ls *deb | sed 's/\.deb//g'
name_ver1+debver2_amd64
name_ver2+debver3_amd64
Иногда я использую bash, иногда tcsh, на домашнем компьютере у меня tcsh,
но на bash конструкцию как в строке с echo никогда не применял, как-то она мне не по душе.
${parameter%word}
${parameter%%word} Remove matching suffix pattern. The word is expanded to produce a pattern just as in pathname expansion. If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expan sion is the expanded value of parameter with the shortest matching pattern (the ``%'' case) or the longest matching pattern (the ``%%'' case) deleted. If parameter is @ or *, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with @ or *, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.
Иногда я использую bash, иногда tcsh, на домашнем компьютере у меня tcsh,
но на bash конструкцию как в строке с echo никогда не применял, как-то она мне не по душе.
Пётр.
echo - только для того чтобы показать вывод, а так обычного присваивания должно быть достаточно.
bormant ну да можно и так, вроде есть и третий вариант.
Возникла потребность отделить от имени deb-пакета его окончание - ".deb"
Без sed|awk и прочих:
[console]basename name_ver1+debver2_amd64.deb .deb[/console]
в цикле можно использовать както так:
[console]SCRIPTDIR=`dirname -- "$0"`
for deblist in $SCRIPTDIR/debpackage/*.deb
do
NAME=`basename $deblist .deb`
echo $NAME;
done[/console]
Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в bash предложенные bormant'ом и ormorph'ом конструкции работают как было задумано, а в, скажем, tcsh она же может делать нечто совершенно другое. Есть еще и вариант с cut и rev:
text
echo package*.deb | rev | cut -d. -f2- | rev
Но эффективнее использовать встроенные средства оболочки, так как при этом не выполняется вызов внешней программы, а значит, экономятся ресурсы.
Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в bash предложенные bormant'ом и ormorph'ом конструкции работают как было задумано, а в, скажем, tcsh она же может делать нечто совершенно другое.
Ну собственно каждый скрипт запускает внешнюю программу, сам командный интерпретатор, за это отвечает первая строка скрипта:
text
#!/bin/bash
Т.е. тут главное иметь установленный bash, не зависимо от того какая оболочка используется по умолчанию, все равно запускается ещё один процесс bash.
Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в bash предложенные bormant'ом и ormorph'ом конструкции работают как было задумано, а в, скажем, tcsh она же может делать нечто совершенно другое. Есть еще и вариант с cut и rev:
text
echo package*.deb | rev | cut -d. -f2- | rev
Но эффективнее использовать встроенные средства оболочки, так как при этом не выполняется вызов внешней программы, а значит, экономятся ресурсы.
Если скорость работы скрипта критична, то стоит отказаться от скриптов в пользу компилируемых языков.
Через cut еще можно так:
[console]echo "name_ver1+debver2_amd64.deb" | cut -d'.' --complement -f2-[/console]