URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8352
[ Назад ]

Исходное сообщение
"Как в sh FreeBSD выделить из строки  несколько символов?"

Отправлено fly , 15-Июл-09 15:32 
Как из строки к,примеру "имяфайла.txt" ,выделить подстроку "имяфайла"(без ".txt")и поместить ее в переменную?

Содержание

Сообщения в этом обсуждении
"Как в sh FreeBSD выделить из строки  несколько символов?"
Отправлено аноним , 15-Июл-09 18:40 
>Как из строки к,примеру "имяфайла.txt" ,выделить подстроку "имяфайла"(без ".txt")и поместить ее в
>переменную?

cut, sed, awk


"Как в sh FreeBSD выделить из строки  несколько символов?"
Отправлено fly , 15-Июл-09 21:31 
а нельзя ли где-нибудь пример посмотреть?


"Как в sh FreeBSD выделить из строки  несколько символов?"
Отправлено аноним , 15-Июл-09 21:51 
>а нельзя ли где-нибудь пример посмотреть?

var=`echo filename.txt | sed -e 's|\.txt$||'`
echo $var

Но правильней в данном случае (отрезать расширение) - как сказали с basename.


"Как в sh FreeBSD выделить из строки  несколько символов?"
Отправлено GR , 15-Июл-09 21:35 
>Как из строки к,примеру "имяфайла.txt" ,выделить подстроку
>"имяфайла"(без ".txt")и поместить ее в переменную?

man basename

$F=`basename имяфайла.txt .txt`



"настоящий FreeBSD позиксвей!"
Отправлено Andrey Mitrofanov , 16-Июл-09 09:15 
WARNING! HATRED AND man sh AHEAD! PROCEED AT UR 0WN RISC!!!

Я _точно_ уверен, что с BSD -- ВЕСЕЛО! Это из вас так позикссовместимость "прёт"?... Увидел вопрос - думаю, чего с крестьянами связываться, ответят же через 10 минут. Ан нет.

Люди, ау! Ни один из вас не читал man sh своего FreeBSD?? Ссылочку дам, мне не сложно: http:/man.shtml?topic=sh&category=1&russian=1 Да, сложно, "нипарусски" и диплом о высшем ну никак не гарантирует умения учиться и читать... Но чтоб куча ответов и все не совсем... эээ... оптимальные?!

Я был понсостью уверен, что искорчен bash-ем и _авнгарда_ вроде
${ parameter % word }
в теме про саму! FreeBSD мне не простят, увидев два "необычных" ответа, проверил и увидел
${ parameter % word }
в своиз man ash и man dash. Тут-то у меня и возник вопрос, а как с
${ parameter % word }
в man sh от FreeBSD.... google... site:opennet.ru (Да! отдельное спасибо за размещение на сайте "миноритарных" man-систем - FreeBSD, Solaris... забавнейшее чтиво, местами.) Ба! так вот оно ж, туточки!!
${ parameter % word }
А вы basename, sed... Perl с питоном и жаввой разве ещё не приплели.

var="text.txt"
var2="${var%.txt}"
echo "$var2.html"


"настоящий FreeBSD позиксвей!"
Отправлено fly , 16-Июл-09 10:01 
Народ, это я так,примерчик бросила.Мне вообще нужно от строчной переменной "7898798qweer" отрезать несколько символов,начиная с какой нибудь позиции.У bash посмотрела $(myvar:4:3),но у нас не стоит bash,есть токо sh  .Как такое же сделать под sh?Помогите,пж,ничего не получается.

"настоящий FreeBSD позиксвей!"
Отправлено fly , 16-Июл-09 11:15 
К примеру, ff="123.001dsa" , мне нужно как то получить из этой переменной первые 6 символов.Как это сделаь?


"настоящий FreeBSD позиксвей!"
Отправлено Pikador , 16-Июл-09 11:46 
>К примеру, ff="123.001dsa" , мне нужно как то получить из этой переменной
>первые 6 символов.Как это сделаь?

Например  http://snap.nlc.dcccd.edu/reference/shellguide/shells.html


"настоящий FreeBSD позиксвей!"
Отправлено fly , 16-Июл-09 12:07 
Спасибо,конечно,но я там ничего не нашла.А помочь ,значит, слабо начинающей?Все когда-то первый раз начинали и уйму времени на все это тратили.Жалко знаниями делится?или просто сами не знаете?


"настоящий FreeBSD позиксвей!"
Отправлено phpcoder , 16-Июл-09 12:48 
>К примеру, ff="123.001dsa" , мне нужно как то получить из этой переменной
>первые 6 символов.Как это сделаь?

coder@ubuntu ~ $ expr substr '123.001dsa' 1 6
123.00

Вот только зуб не дам, что это сработает во FreeBSD В таком случае, можно использовать awk:

coder@ubuntu ~ $ echo '123.001dsa' | awk '{print substr($0, 1, 6)}'
123.00

или sed:

coder@ubuntu ~ $ echo '123.001dsa' | sed 's|^\(.\{6\}\).*|\1|'
123.00

или perl/python/etc


"настоящий FreeBSD позиксвей!"
Отправлено phpcoder , 16-Июл-09 12:41 
>так вот оно ж, туточки!!
> ${ parameter % word }
>А вы basename, sed...

Вариант с basename более читаем IMHO, чем эти шельные ${} инструкции.


"настоящий FreeBSD позиксвей!"
Отправлено fly , 16-Июл-09 14:00 
написала
echo '123.001dsa'|awk'{print substr($0, 1, 6)}'
Ругается,по сле awk... пишет not found

"настоящий FreeBSD позиксвей!"
Отправлено allez , 16-Июл-09 16:18 
>написала
>echo '123.001dsa'|awk'{print substr($0, 1, 6)}'
>Ругается,по сле awk... пишет not found

А в выполненной вами команде после "awk" тоже нет пробела?
Если его нет, то должно получиться что-то вроде этого:

$ echo '123.001dsa'|awk'{print substr($0, 1, 6)}'
bash: awk{print substr($0, 1, 6)}: команда не найдена
bash: echo: ошибка записи: Обрыв канала
Что, в общем-то, вполне понятно: команда awk{print substr($0, 1, 6)} вряд ли существует. ;-)

Если же пробел поставить, то конструкция отрабатывает нормально:

$ echo '123.001dsa' | awk '{print substr($0, 1, 6)}'
123.00


"настоящий FreeBSD позиксвей!"
Отправлено Warhead Wardick , 16-Июл-09 21:13 
>WARNING! HATRED AND man sh AHEAD! PROCEED AT UR 0WN RISC!!!
> ${ parameter % word }

Андрюша ты чего так возбудился то? Вопрошающей в первые пять секунд рассказали о basename.
Ну а потом пошли бантики что я мол имела в виду совсем другое ...
"Или давайте лучше я перефразирую вопрос! Где в Москве можно купить приличную бижутерию?"(С)Большая разница.


А вообще рекомендую впялить http://www.freebsd.org/cgi/man.cgi в закладки. Для такого рода исследований - самое оно :)

Как то так.


"виноват-с. исправлюсь. хотя...."
Отправлено Andrey Mitrofanov , 17-Июл-09 10:01 
>Андрюша ты чего так возбудился то? Вопрошающей в первые пять секунд рассказали
>о basename.

Про этот basename раз в неделю рассказывают - несколько раздражает. В частности и использование двух процессов и пайпов для того, что "шифруется" одним ин-лайн выражением шелл. ... Ну, не сдержал "порыв", да.

А давайте напишем ---

"Advanced FreeBSD sh scritping guide" (краткое издание):

1. Ответ на любой вопрос "как мне во FreeBSD шелл ..." -- есть в man sh[ссылка-^выше].
1.1. Просмотреть, запомнить, отработать навыки использования встроенных -- типов данных, объектов (окружение, переменные, процессы, массивы, "фоновые" задания, определение функций, и т.п.), функций для работы с ними (=разнообразие и систематизация встроенных команд и конструкций).
1.99. Ответ на любой вопрос есть в п.1, ответы на другие _есть_ в следующих.
2. Для [не описанной п.1] обработки данных на шеле _надо_ использовать програмы-фильтры. См. gnu coreutils, awk (gawk,nawk,mawk...), sed (+?gsed), и т.д. вплоть до однострочников или около того на perl.(Да, man sh не достаточно для многих задач.)
2.0.1. sh как среда объединения задач в большей степени, чем [?замкнутый] язык программирования. (TAOUP)
2.1. Регулярные регулярные регулярные регулярные выражения выражения выражения выражения.[ссылки-^выше]
3. Для использования (интеграции/управления потоком данных) програм-фильтров _надо_ [пере]осмыслить конструкции из п.1 - конвейеры, перенаправления, субшелы и пр.
3.1. Да, просенькие фильтры можно писать на самом шеле. (|while read var; do ...)
4. Всё укра^Wпридумано до нас - не надо самому ничего "придумывать", главное найти, где почитать и уты^Wнаучиться. (Чужие скрипты, "Adv.BASH scripting guide", ещё чужие скрипты, _читать_ архивы форумов/рассылок.)
4.0.1. То, что не придумано до - придумать во время. Осторожно!
4.1. Осмыслить преобретённый опыт работы с и использования -- определить, какие задачи боьше походят для, какие задачи - меньше. (hint: TAOUP)
4.99. Повторять в процессе _всё_, начиная с п.1 !
5. Над шелом, горизонты шире: какие полезные прогрмы м.б.использованы в, расширяя его ещё более другими функциями. (gnu screen, ещё раз - coreutils (каждый раз что-то новое!), psmisc?работа с процессам)
6. Позикс шел, фри-бсд-шелизмы, обязательный курс молодого борца с башшизмами и линукс-кернелизмами, стрельба из базуки и метание грязных гранат.
6.1. Краткий курс пар^Wистории: позикс, юникс(тм). AT&T против USC Berkeley - Unix против BSD?
6.2. Свобода религии: GNU и GPL -- любовь или ненависть?

"Я это сделал!"(тм) -- Митрофанов А.Б., сим передаю текст выше в общественное достояние (=public domain)


"виноват-с. исправлюсь. хотя...."
Отправлено fly , 17-Июл-09 19:26 
Аlles, БОЛЬШОЕ СПАСИБО.Все получилось.Сисадмин уехал в отпуск..срочно нужно было скрипт написать,вот и приходится самой разбираться.Видно не все линуксоиды злые...трудно им наверное,вот и злые...::-))


"виноват-с. исправлюсь. хотя...."
Отправлено allez , 19-Июл-09 10:00 
>Аlles, БОЛЬШОЕ СПАСИБО.Все получилось.Сисадмин уехал в отпуск..срочно нужно было скрипт написать,вот и
>приходится самой разбираться.Видно не все линуксоиды злые...трудно им наверное,вот и злые...::-))

Да завсегда пожалуйста. :-)
Уважаемая fly, Андрей Митрофанов и Warhead Wardick "ополчились" вовсе не на Вас.
По крайней мере, у меня сложилось именно такое впечатление.


"виноват-с. исправлюсь. хотя...."
Отправлено Warhead Wardick , 17-Июл-09 19:59 
Написать такой труд было бы здорово, но! Левой задней ногой делать не хотелось бы, а качественное изложение - есть большой труд.

Ну и в общем - ты их хочешь _научить_! Не quick'n'dirty а системно и последовательно ...
Научить тех кого не смогли\не захотели научить в школе \ институте \ универе \ на работе ...
Возникают ведь вопросы:
- а хотят ли они сами учиться? (в свете вышеизложенного - хрена с два!)
- а оно мне надо? СССР кончился - теперь каждый сам за себя :(
...
- будешь в канадии - дай знать, возьму хорошего вискаря и пожарю шашлыков. Ну должна же быть хоть какая то награда тянущим лямку без единого шанса :)


"виноват-с. исправлюсь. хотя...."
Отправлено az , 28-Июл-09 23:49 
взято с http://lib.ru/unixhelp/unixshell.txt

      5_3. Команда ena

     Команда ena позволяет получить части полного имени  файла.
Первый аргумент - флаг, второй - имя файла.  Команда  различает
следующие флаги:
-n              - имя файла без расширения
-f              - имя файла с расширением
-e              - расширение
-d              - имя директории
-p              - если имя файла начинается с . или .. , то эти
                  символы выделяются из имени

     Ниже приводится текст программы ena, хранящийся в /util/ena.

#       Get part of pathname

case    $1      in
-n )
       expr $2 : '.*/\(.*\)[.].*' \| $2 : '\(.*\)[.].*' \| $2
       ;;
-f )
       expr $2 : '.*/\(.*\)' \| $2
       ;;
-e )
       expr $2 : '.*\([.][^./]*\)' \| ' '
       ;;
-d )
       expr $2 : '\(.*\)/.*' \| $2
       ;;
-p )
       expr $2 : '\([.]\)/.*' \| $2 : '\([.][.]\)/.*' \| ' '
       ;;
*  )
       echo "error: unknown part of pathname $1"
       exit 2
       ;;
esac

PS. Учите матчасть