LINUX.ORG.RU

как вырезать подстроку из строки в скрипте?


0

0

есть строка вида (echo $*):

-t iso9660 -o nosuid,nodev,uid=1000,noatime,utf8 /dev/sr0 /media/ПЛУЖАРЕ-2! может быть и вида -t iso9660 /dev/sr0 /media/ПЛУЖАРЕ-2! -o nosuid,nodev,uid=1000,noatime,utf8

нужно из нее получить вот этот (/media/ПЛУЖАРЕ-2!) фрагмент в переменную $utf8_path как это сделать? само собой понимается что этот путь может быть как в средине так и в конце строки передаваемых параметров $* , то есть может быть ограничен пробелами, табуляцией или концом строки

помогите, плиз, ибо я не разбираюсь в работе со строками и регулярными выражениями


Ответ на: комментарий от ip1981

sed, expr и т.д. - можно не продолжать. я попросил решение а не "ходи в man" - к сожалению я до этого никогда не работал со строками и мне нужно срочно это сделать

SwitNJ
() автор топика

в твоем примере не нужна ни одна внешняя программа

%%%
#! /bin/sh

set -- -t iso9660 /dev/sr0 "/media/ПЛУЖАРЕ-2!" -o nosuid,nodev,uid=

for arg; {
    case $arg in
	*/media/*) utf8_path=$arg
    esac
}

echo $utf8_path
%%%

удали строку с `set' и получишь искомое

anonymous
()

http://sed.sourceforge.net — примеры на все случаи жизни.

В данном случае может помочь следующее:

echo $* | sed 's/.*\/media/\/media/;s/ .*//'

отрежет от $* всё, что перед /media и всё, что после первого пробела. Правда, в данном случае последовательность 'Р ' воспринимается не как символ UTF-8, а как 2 буквы. Разберись с кодировками.

Также может быть полезен вариант

`echo $* | sed 's/.*\/media/\/media/;s/ .*//'`

question4 ★★★★★
()
Ответ на: комментарий от question4

Неверно обработает пробел в аргументе "/mount/ab cd". :(

Лучше:

perl -p -e 's:.*([ "'"'"'])(/media/.+?)\1.*:\2:'

Пробовал настрочить на sed, но выяснил, что тот не поддерживает non-greedy регулярные выражения. По крайней мере, я не нашел, как их включить.

Ruth ★★
()
Ответ на: комментарий от Ruth

Вернее, в "/media/ab cd". Ну и, конечно, я забыл echo:

echo $somevar | perl -p -e 's:.*([ "'"'"'])(/media/.+?)\1.*:\2:'

Пример:

$ echo '-t iso9660 /dev/sr0 "/media/ПЛУЖАРЕ-2!" xyz 123' | perl -p -e 's:.*([ "'"'"'])(/media/.+?)\1.*:\2:'
/media/ПЛУЖАРЕ-2!

Ruth ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.