Выделение подстроки в bash-скрипте.

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
Zeus
Сообщения: 694

Выделение подстроки в bash-скрипте.

Сообщение Zeus »

Никогда толком скриптами не занимался, а тут всплыла такая задача:
нужно прошерстить файлы, найти в них определённого формата строки и выделить из них 2 числа и две строки (если таковые выделятся).
Хранить всё это нужно будет видимо в массивах (если они есть в скриптах).
Проблема-то в общем в следующем:
прочёсываю я файлы grep'ом. regexp для выделения нужной строки я уже сформировал.
А вот как из неё выдрать нужные подстроки?
У неё формат такой:
символычисло_числосимволы#подстрока1$подстрока2
То что после # может и не быть.
Наверное sed нужно использовать или что?
Не пойму кому передать вывод grep'а чтобы выделить из строки несколько подстрок (для текстовых процессоров выделяемые числа тоже строки ведь) и раскидать их по переменным.
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

sed вместе с s тебе поможет - курим `info sed`

или awk, если хочеш по мухам ядерными боеголовками
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

ety писал(а):
05.07.2006 10:29
sed вместе с s тебе поможет - курим `info sed`

или awk, если хочеш по мухам ядерными боеголовками

sed я раскурил - продолжаю дымить.
Непонятно как он может вернуть 4 строки.
Ну дам я ему "запомнить" такой-то фрагмент, такой-то фрагмент...
А как он их в виде 4х строк вернёт-то?
Мало наверное курил ещё, но иначе и спрашивать не стал бы.
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
05.07.2006 10:37
sed я раскурил - продолжаю дымить.
Непонятно как он может вернуть 4 строки.
Ну дам я ему "запомнить" такой-то фрагмент, такой-то фрагмент...
А как он их в виде 4х строк вернёт-то?
Мало наверное курил ещё, но иначе и спрашивать не стал бы.

курим дальше, ибо уж больно у него ман забористый. пока не поймеш что делает следующий фрагмент написанный мною в раннии годы, ибо сам я уж позабыл, помню только, что много строк возвращает...
sed -n "
s%\x0d%%
s%\(.*\)%\L\1%
/.*add.*/ {
s%.*route%%
s%[ ]\+-[^ ]*%%
h
s%.*add[ ]*\([^ ]*\).*% \1%p
g
s%add[ ]*\([^ ]*\)%%
h
s%.*mask[ ]*\([^ ]*\).*% \1%p
g
s%mask[ ]*\([^ ]*\)%%
s%^.*[ ]\+\(.*\..*\..*\.[^ ]\)% \1%p
}
"


так-же в sed есть циклы, и он даже является машиной туринга.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Выделение подстроки в bash-скрипте.

Сообщение madskull »

Zeus
Какой результат нужно получить? Какие четыре строки? В каком виде?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

:blink:
Я конечно покопаюсь, но что-то начинаю склоняться к старым добрым универсальным плюсам...
:unsure:

madskull писал(а):
05.07.2006 14:05
Zeus
Какой результат нужно получить? Какие четыре строки? В каком виде?

Собственно у меня (из плюсов) мысли:
эти два числа - два индекса двумерного массива. Даже двух.
В одном лежит первая подстрока (если она нашлась)
Во втором - вторая (если нашлась).
Иначе - данный элемент массива является пустой строкой.

Не знаю насколько это реализуемо в скриптах...
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
05.07.2006 14:09
Собственно у меня (из плюсов) мысли:
эти два числа - два индекса двумерного массива. Даже двух.
В одном лежит первая подстрока (если она нашлась)
Во втором - вторая (если нашлась).
Иначе - данный элемент массива является пустой строкой.

Не знаю насколько это реализуемо в скриптах...

на башевых скриптах, что-бы все было очень быстро, у нас подход другой - там ключевое слово фильтр ;)
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Выделение подстроки в bash-скрипте.

Сообщение madskull »

Есть подозрение, что неправильно поставлена задача и можно обойтись без массивов, что это наследие из "плюсов" (кстати, что такое "плюсы"? С++?) и ety прав насчет конвейеров.
Ну а если без массивов никак, то вот одно из решений (при условии, что "подстрока" не содержит пробелов)
(не проверял!)

Код: Выделить всё

while read n1 n2 s1 s2; do
    a1[$n1]=$s1
    a2[$n2]=$s2
done < <(
   <тут что-то, что формирует "символычисло_числосимволы#подстрока1$подстрока2"> |
   sed 's/^[^0-9]*\([0-9]\+\)_\([0-9]\+\).*#\(.*\)$\(.*\)/\1 \2 \3 \4/'
)

в результате, в два "параллельных" массива попадают подстроки.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

Спасибо, попробую.
А без массивов никак, т.к. там грубо говоря нужно из одной "таблицы" (неупорядоченных данных) нужно сформировать упорядоченную "таблицу" (xml-файл).
Данные поступают потоком строк от grep'а, их нужно СНАЧАЛА все прочитать, а потом генерить xml в определённом формате.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

Эхь, или не заточены у меня мозги для sed'а этого или man уродский :(
Он у меня или целиком строки выводит или (если поставить ключик -n) вообще ничего.
Не могу заставить его вывести эти несчастные n1 n2 s1 s2.
Непонятно куда и какую команду вставить...
Вроде %p - не реагирует...
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
06.07.2006 14:18
Эхь, или не заточены у меня мозги для sed'а этого или man уродский :(

нет, просто одной командой ничего не делается, а если нужна определенная последовательность не забываем добавлять идентификаторы, а потом sort или grep и uniq следующими командами

и не забываем про "sed <whatever> | {while read x y z; <do sumthing with x, y and z>}"
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

ety писал(а):
06.07.2006 22:36
нет, просто одной командой ничего не делается, а если нужна определенная последовательность не забываем добавлять идентификаторы, а потом sort или grep и uniq следующими командами

и не забываем про "sed <whatever> | {while read x y z; <do sumthing with x, y and z>}"

Не, ну я вот попробовал как madskull предложил - в общем-то такой принцип вполне устраивает, я за него ухватился, но sed в свой стандартный вывод (т.е. по каналу - read'у) не кидает строки вида:
число1 число2 строка1 строка2
Или целиком строку или вообще ничего.
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
06.07.2006 23:12
Не, ну я вот попробовал как madskull предложил - в общем-то такой принцип вполне устраивает, я за него ухватился, но sed в свой стандартный вывод (т.е. по каналу - read'у) не кидает строки вида:
число1 число2 строка1 строка2
Или целиком строку или вообще ничего.

нет, все можно сделать, нужно немножко практики, и смена подхода, - агрегации всегда ОЧЕНЬ медленные в скриптах, - фильтры гениально решили эту проблему :)

а для седа - hold space помогает, можеш попробовать awk, если решение на седе выливается во много сторк :)
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

нет, все можно сделать, нужно немножко практики, и смена подхода, - агрегации всегда ОЧЕНЬ медленные в скриптах, - фильтры гениально решили эту проблему

а для седа - hold space помогает, можеш попробовать awk, если решение на седе выливается во много сторк

Стоп-стоп! Как много строк-то? sed'у же передаётся одна строка всего? Примерно как madskull написал? Только В НЕЙ как-то нужно указать, чтобы он вывел только запомненные подстроки. Или это одной командой не сделаешь? Надо, типа, скрипт sed'овский писать?
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
07.07.2006 00:11
Стоп-стоп! Как много строк-то? sed'у же передаётся одна строка всего? Примерно как madskull написал? Только В НЕЙ как-то нужно указать, чтобы он вывел только запомненные подстроки. Или это одной командой не сделаешь? Надо, типа, скрипт sed'овский писать?

неа, одной не сделаеш :(

если бы все моно было сделать одной командой, то достаточно было бы набрать
make_world_better<ENTER>
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

ety писал(а):
07.07.2006 00:44
Zeus писал(а):
07.07.2006 00:11
Стоп-стоп! Как много строк-то? sed'у же передаётся одна строка всего? Примерно как madskull написал? Только В НЕЙ как-то нужно указать, чтобы он вывел только запомненные подстроки. Или это одной командой не сделаешь? Надо, типа, скрипт sed'овский писать?

неа, одной не сделаеш :(

Ладно, тогда sed фтопку. Буду юзать C/C++ - там тоже "одной командой не сделаешь" :)

ety писал(а):
07.07.2006 00:44
если бы все моно было сделать одной командой, то достаточно было бы набрать
make_world_better<ENTER>


А я набирал. И получалось. :huh:
:D
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
07.07.2006 10:28
Буду юзать C/C++ - там тоже "одной командой не сделаешь" :)

ну... уже 35 лет юзеры на nix-ов предпочитают Сишке bash, хотя половина из них знает C/C++ на отлично %)
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Выделение подстроки в bash-скрипте.

Сообщение madskull »

(Zeus @ Jul 6 2006, в 12:18) писал(а):Эхь, или не заточены у меня мозги для sed'а этого или man уродский
Он у меня или целиком строки выводит или (если поставить ключик -n) вообще ничего.
Не могу заставить его вывести эти несчастные n1 n2 s1 s2.
Непонятно куда и какую команду вставить...
Вроде %p - не реагирует...


попробуй:

Код: Выделить всё


echo 'символы12_34символы#подстрока1$подстрока2' |
sed 's/^[^0-9]*\([0-9]\+\)_\([0-9]\+\).*#\(.*\)$\(.*\)/\1 \2 \3 \4/'

должно получиться:
12 34 подстрока1 подстрока2

Если нет, значит косяк с копированием.


(ety @ Jul 6 2006, в 22:44) писал(а):неа, одной не сделаеш

А что я сделал выше? Или я не понял, о чем спич?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

madskull писал(а):
07.07.2006 11:39
А что я сделал выше? Или я не понял, о чем спич?

эмм... наверное я не понял, и думал разбить одну строку на несколько строк.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Выделение подстроки в bash-скрипте.

Сообщение elide »

хм.... а в строке /\1 \2 \3 \4/ заменить пробелы на \n, чтоб получилось /\1\n\2\n\3\n\4/ и, соответственно, 4 строки вместо одной, Ктулху не позволяет?
слава роботам!
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

elide писал(а):
07.07.2006 22:45
хм.... а в строке /\1 \2 \3 \4/ заменить пробелы на \n, чтоб получилось /\1\n\2\n\3\n\4/ и, соответственно, 4 строки вместо одной, Ктулху не позволяет?

А что это даёт?


А на sed я всё-равно забил, потому что не могу подобрать ему регулярное выражение.
Для grep'а всё просто, а этому пип ещё какие-то слэши нужно ставить. И всё-равно не помогают.
Короче, пишу на С.
Извините за беспокойство.
:unsure:
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

elide писал(а):
07.07.2006 22:45
хм.... а в строке /\1 \2 \3 \4/ заменить пробелы на \n, чтоб получилось /\1\n\2\n\3\n\4/ и, соответственно, 4 строки вместо одной, Ктулху не позволяет?

хмм... почему-то у меня не получалось с \n, и в pattern space он не работает.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Выделение подстроки в bash-скрипте.

Сообщение elide »

Код: Выделить всё

REGULAR EXPRESSIONS
       POSIX.2  BREs should be supported, but they aren't completely because of performance problems.  The \n sequence in a regular expression matches the newline character, and similarly for \a, \t, and other sequences.
слава роботам!
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Выделение подстроки в bash-скрипте.

Сообщение madskull »

(Zeus @ Jul 8 2006, в 19:03) писал(а):Короче, пишу на С.

Это не решение проблемы, а уход от нее ;)

Или на "каждый чих" будешь сишную программу писать?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

madskull писал(а):
10.07.2006 08:03
(Zeus @ Jul 8 2006, в 19:03) писал(а):
Короче, пишу на С.

Это не решение проблемы, а уход от нее ;)

Да я понимаю, но некогда сейчас изучать что-то новое.
Нужно было сделать. Как - неважно.
Вот я и написал на том, на чём умею.
Хотя хотел, конечно, в скриптах это всё наворотить: и практика новая и компилить не надо если что-то изменить нужно будет.
Но у этого sed'а man, лично мне, ничего не говорящий.
Какие параметры передать - это и sed --help можно посмотреть.
А тонкости его регулярных выражений там не описаны.
И вообще, почему они отличаются от тех же grep'овых?
Спасибо сказали:
Аватара пользователя
ety
Сообщения: 358
ОС: Linux

Re: Выделение подстроки в bash-скрипте.

Сообщение ety »

Zeus писал(а):
10.07.2006 10:39
Но у этого sed'а man, лично мне, ничего не говорящий.

у него ман по команде "info sed" (гипер текст), что "man sed" и сообщает.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Выделение подстроки в bash-скрипте.

Сообщение Zeus »

ety писал(а):
10.07.2006 11:22
Zeus писал(а):
10.07.2006 10:39
Но у этого sed'а man, лично мне, ничего не говорящий.

у него ман по команде "info sed" (гипер текст), что "man sed" и сообщает.

Мнда...
Да ладно, я уже на сях написал.
На досуге поковыряюсь и с sed'ом. Если он (досуг) будет.
Спасибо сказали:
Ответить