1

Здравствуйте!

Возникла потребность отделить от имени deb-пакета его окончание - ".deb",
а само имя имеет вид name_ver1+debver2_amd64.deb.
Я пытался сделать это с помощью awk, задавая разделитель как ".deb", как '.deb' и как "\.deb"
и выводя 1-е поле, в 3-м случае получаю сообщение, что '.' трактуется как plain, но всё равно
выводится то, что перед "+deb", как если бы и задавал разделитель "+deb".
Пытался и отдельно задвать FS="\.deb", всё равно.
Как получить желаемое?

Пётр.

Пётр.

2

Peter, А чем sed не устроил??

 Консоль:

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

linux-gsu4:/home/dcrp #

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

3

Благодарю за подсказку, я очень редко использую sed. Очень хорошее решение.
Всё же любопытно было бы узнать, почему не работает "\.deb".

Пётр.

Пётр.

4

Peter пишет:

Благодарю за подсказку, я

Да незачто

Peter пишет:

, почему не работает "\.deb".

Ну эт уже не ко мне))) Про awk я лишь слышал когда-то be

- Пап, а вирусы под линукс есть?
- Есть, но всего 5, и их сначала нужно откомпилировать под свою систему, дать права на запуск и запустить.
Как сделать и разместить скриншот || Прежде чем создавать тему

5

Ну вообще если в скрипте, то это можно сделать средствами bash, без всяких сторонних утилит.

#!/bin/bash
ls *.deb|while read file
do 
   echo ${file/.deb/}
done

6

Иногда я использую bash, иногда tcsh, на домашнем компьютере у меня tcsh,
но на bash конструкцию как в строке с echo никогда не применял, как-то она мне не по душе.

Пётр.

Пётр.

7 (10.01.2017 00:42:52 отредактировано bormant)

ormorph,
в bash есть более подходящий вариант:

${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.

8

Peter пишет:

Иногда я использую bash, иногда tcsh, на домашнем компьютере у меня tcsh,
но на bash конструкцию как в строке с echo никогда не применял, как-то она мне не по душе.

Пётр.

echo - только для того чтобы показать вывод, а так обычного присваивания должно быть достаточно.

bormant ну да можно и так, вроде есть и третий вариант.

9

Ещё раз благодарю, обычно я стараюсь делать попроще, в т.ч. на C.

Пётр.

Пётр.

10 (11.01.2017 21:24:03 отредактировано beliy)

Peter пишет:

Возникла потребность отделить от имени deb-пакета его окончание - ".deb"

Без sed|awk и прочих:

 Консоль:
basename name_ver1+debver2_amd64.deb .deb

в цикле можно использовать както так:

 Консоль:
SCRIPTDIR=`dirname -- "$0"`
for deblist in $SCRIPTDIR/debpackage/*.deb
do
    NAME=`basename $deblist .deb`
    echo $NAME;
done

Не тестил, но должно работать

11

beliy, Благодарю за идею, сам никогда эту страницу "man basename", с суффиксом, не читал.

Пётр.

Пётр.

12

Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в bash предложенные bormant'ом и ormorph'ом конструкции работают как было задумано, а в, скажем, tcsh она же может делать нечто совершенно другое. Есть еще и вариант с cut и rev:

echo package*.deb | rev | cut -d. -f2- | rev

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Slackware64-current/Xfce/Lenovo G580

13

yars пишет:

Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в bash предложенные bormant'ом и ormorph'ом конструкции работают как было задумано, а в, скажем, tcsh она же может делать нечто совершенно другое.

Ну собственно каждый скрипт запускает внешнюю программу, сам командный интерпретатор, за это отвечает первая строка скрипта:

#!/bin/bash

Т.е. тут главное иметь установленный bash, не зависимо от того какая оболочка используется по умолчанию, все равно запускается ещё один процесс bash.

14 (12.01.2017 19:19:13 отредактировано beliy)

yars пишет:

Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в bash предложенные bormant'ом и ormorph'ом конструкции работают как было задумано, а в, скажем, tcsh она же может делать нечто совершенно другое. Есть еще и вариант с cut и rev:

echo package*.deb | rev | cut -d. -f2- | rev

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

Если скорость работы скрипта критична, то стоит отказаться от скриптов в пользу компилируемых языков.
Через cut еще можно так:

 Консоль:
echo "name_ver1+debver2_amd64.deb" | cut -d'.' --complement -f2-