LinuxForum.Fans
Тема

. in FS in awk

Автор: Peter 14 сообщений 1762 просмотров
09.01.2017 20:21 #418782

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

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

Пётр.

09.01.2017 20:51 #418783

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


linux-gsu4:/home/dcrp #
[/console]

09.01.2017 21:23 #418786

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

Пётр.

09.01.2017 21:24 #418787

"Peter" написал:
Благодарю за подсказку, я
Да незачто

"Peter" написал:
, почему не работает "\.deb".
Ну эт уже не ко мне))) Про awk я лишь слышал когда-то %)
09.01.2017 23:12 #418788

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

text
#!/bin/bash
ls *.deb|while read file
do 
   echo ${file/.deb/}
done
09.01.2017 23:32 #418789

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

Пётр.

10.01.2017 00:42 · отредактировано #418791

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.
10.01.2017 03:59 #418792
Peter написал:
Иногда я использую bash, иногда tcsh, на домашнем компьютере у меня tcsh,
но на bash конструкцию как в строке с echo никогда не применял, как-то она мне не по душе.

Пётр.

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

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

10.01.2017 09:04 #418794

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

Пётр.

11.01.2017 21:20 · отредактировано #418831
Peter написал:
Возникла потребность отделить от имени 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]

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

11.01.2017 23:52 #418844

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

Пётр.

12.01.2017 01:09 #418849

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

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

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

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

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

text
#!/bin/bash

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

12.01.2017 19:05 · отредактировано #418908
yars написал:
Если скорость работы скрипта критична, то стоит использовать средства оболочки, но тут есть одна тонкость, а именно -- в 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]

Войдите или зарегистрируйтесь, чтобы ответить.