Выделение подстроки в bash-скрипте.
Модераторы: /dev/random, Модераторы разделов
Выделение подстроки в bash-скрипте.
Никогда толком скриптами не занимался, а тут всплыла такая задача:
нужно прошерстить файлы, найти в них определённого формата строки и выделить из них 2 числа и две строки (если таковые выделятся).
Хранить всё это нужно будет видимо в массивах (если они есть в скриптах).
Проблема-то в общем в следующем:
прочёсываю я файлы grep'ом. regexp для выделения нужной строки я уже сформировал.
А вот как из неё выдрать нужные подстроки?
У неё формат такой:
символычисло_числосимволы#подстрока1$подстрока2
То что после # может и не быть.
Наверное sed нужно использовать или что?
Не пойму кому передать вывод grep'а чтобы выделить из строки несколько подстрок (для текстовых процессоров выделяемые числа тоже строки ведь) и раскидать их по переменным.
нужно прошерстить файлы, найти в них определённого формата строки и выделить из них 2 числа и две строки (если таковые выделятся).
Хранить всё это нужно будет видимо в массивах (если они есть в скриптах).
Проблема-то в общем в следующем:
прочёсываю я файлы grep'ом. regexp для выделения нужной строки я уже сформировал.
А вот как из неё выдрать нужные подстроки?
У неё формат такой:
символычисло_числосимволы#подстрока1$подстрока2
То что после # может и не быть.
Наверное sed нужно использовать или что?
Не пойму кому передать вывод grep'а чтобы выделить из строки несколько подстрок (для текстовых процессоров выделяемые числа тоже строки ведь) и раскидать их по переменным.
Re: Выделение подстроки в bash-скрипте.
sed вместе с s тебе поможет - курим `info sed`
или awk, если хочеш по мухам ядерными боеголовками
или awk, если хочеш по мухам ядерными боеголовками
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
sed я раскурил - продолжаю дымить.
Непонятно как он может вернуть 4 строки.
Ну дам я ему "запомнить" такой-то фрагмент, такой-то фрагмент...
А как он их в виде 4х строк вернёт-то?
Мало наверное курил ещё, но иначе и спрашивать не стал бы.
Re: Выделение подстроки в bash-скрипте.
курим дальше, ибо уж больно у него ман забористый. пока не поймеш что делает следующий фрагмент написанный мною в раннии годы, ибо сам я уж позабыл, помню только, что много строк возвращает...
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 есть циклы, и он даже является машиной туринга.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
Zeus
Какой результат нужно получить? Какие четыре строки? В каком виде?
Какой результат нужно получить? Какие четыре строки? В каком виде?
ArchLinux / IceWM
Re: Выделение подстроки в bash-скрипте.
Я конечно покопаюсь, но что-то начинаю склоняться к старым добрым универсальным плюсам...
Собственно у меня (из плюсов) мысли:
эти два числа - два индекса двумерного массива. Даже двух.
В одном лежит первая подстрока (если она нашлась)
Во втором - вторая (если нашлась).
Иначе - данный элемент массива является пустой строкой.
Не знаю насколько это реализуемо в скриптах...
Re: Выделение подстроки в bash-скрипте.
Zeus писал(а): ↑05.07.2006 14:09Собственно у меня (из плюсов) мысли:
эти два числа - два индекса двумерного массива. Даже двух.
В одном лежит первая подстрока (если она нашлась)
Во втором - вторая (если нашлась).
Иначе - данный элемент массива является пустой строкой.
Не знаю насколько это реализуемо в скриптах...
на башевых скриптах, что-бы все было очень быстро, у нас подход другой - там ключевое слово фильтр
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
Есть подозрение, что неправильно поставлена задача и можно обойтись без массивов, что это наследие из "плюсов" (кстати, что такое "плюсы"? С++?) и 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
Re: Выделение подстроки в bash-скрипте.
Спасибо, попробую.
А без массивов никак, т.к. там грубо говоря нужно из одной "таблицы" (неупорядоченных данных) нужно сформировать упорядоченную "таблицу" (xml-файл).
Данные поступают потоком строк от grep'а, их нужно СНАЧАЛА все прочитать, а потом генерить xml в определённом формате.
А без массивов никак, т.к. там грубо говоря нужно из одной "таблицы" (неупорядоченных данных) нужно сформировать упорядоченную "таблицу" (xml-файл).
Данные поступают потоком строк от grep'а, их нужно СНАЧАЛА все прочитать, а потом генерить xml в определённом формате.
Re: Выделение подстроки в bash-скрипте.
Эхь, или не заточены у меня мозги для sed'а этого или man уродский
Он у меня или целиком строки выводит или (если поставить ключик -n) вообще ничего.
Не могу заставить его вывести эти несчастные n1 n2 s1 s2.
Непонятно куда и какую команду вставить...
Вроде %p - не реагирует...
Он у меня или целиком строки выводит или (если поставить ключик -n) вообще ничего.
Не могу заставить его вывести эти несчастные n1 n2 s1 s2.
Непонятно куда и какую команду вставить...
Вроде %p - не реагирует...
Re: Выделение подстроки в bash-скрипте.
нет, просто одной командой ничего не делается, а если нужна определенная последовательность не забываем добавлять идентификаторы, а потом sort или grep и uniq следующими командами
и не забываем про "sed <whatever> | {while read x y z; <do sumthing with x, y and z>}"
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
Не, ну я вот попробовал как madskull предложил - в общем-то такой принцип вполне устраивает, я за него ухватился, но sed в свой стандартный вывод (т.е. по каналу - read'у) не кидает строки вида:
число1 число2 строка1 строка2
Или целиком строку или вообще ничего.
Re: Выделение подстроки в bash-скрипте.
нет, все можно сделать, нужно немножко практики, и смена подхода, - агрегации всегда ОЧЕНЬ медленные в скриптах, - фильтры гениально решили эту проблему
а для седа - hold space помогает, можеш попробовать awk, если решение на седе выливается во много сторк
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
нет, все можно сделать, нужно немножко практики, и смена подхода, - агрегации всегда ОЧЕНЬ медленные в скриптах, - фильтры гениально решили эту проблему
а для седа - hold space помогает, можеш попробовать awk, если решение на седе выливается во много сторк
Стоп-стоп! Как много строк-то? sed'у же передаётся одна строка всего? Примерно как madskull написал? Только В НЕЙ как-то нужно указать, чтобы он вывел только запомненные подстроки. Или это одной командой не сделаешь? Надо, типа, скрипт sed'овский писать?
Re: Выделение подстроки в bash-скрипте.
неа, одной не сделаеш
если бы все моно было сделать одной командой, то достаточно было бы набрать
make_world_better<ENTER>
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
Re: Выделение подстроки в bash-скрипте.
ну... уже 35 лет юзеры на nix-ов предпочитают Сишке bash, хотя половина из них знает C/C++ на отлично %)
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
(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
Re: Выделение подстроки в bash-скрипте.
эмм... наверное я не понял, и думал разбить одну строку на несколько строк.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
хм.... а в строке /\1 \2 \3 \4/ заменить пробелы на \n, чтоб получилось /\1\n\2\n\3\n\4/ и, соответственно, 4 строки вместо одной, Ктулху не позволяет?
слава роботам!
Re: Выделение подстроки в bash-скрипте.
А что это даёт?
А на sed я всё-равно забил, потому что не могу подобрать ему регулярное выражение.
Для grep'а всё просто, а этому пип ещё какие-то слэши нужно ставить. И всё-равно не помогают.
Короче, пишу на С.
Извините за беспокойство.
Re: Выделение подстроки в bash-скрипте.
хмм... почему-то у меня не получалось с \n, и в pattern space он не работает.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
Re: Выделение подстроки в bash-скрипте.
Код: Выделить всё
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.
слава роботам!
Re: Выделение подстроки в bash-скрипте.
(Zeus @ Jul 8 2006, в 19:03) писал(а):Короче, пишу на С.
Это не решение проблемы, а уход от нее
Или на "каждый чих" будешь сишную программу писать?
ArchLinux / IceWM
Re: Выделение подстроки в bash-скрипте.
Да я понимаю, но некогда сейчас изучать что-то новое.
Нужно было сделать. Как - неважно.
Вот я и написал на том, на чём умею.
Хотя хотел, конечно, в скриптах это всё наворотить: и практика новая и компилить не надо если что-то изменить нужно будет.
Но у этого sed'а man, лично мне, ничего не говорящий.
Какие параметры передать - это и sed --help можно посмотреть.
А тонкости его регулярных выражений там не описаны.
И вообще, почему они отличаются от тех же grep'овых?
Re: Выделение подстроки в bash-скрипте.
у него ман по команде "info sed" (гипер текст), что "man sed" и сообщает.
Образование - это вовсе не то, чему человека учили, а то, чему он научился.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.
-----
Время, необходимое на компиляцию пакета обратно пропорционально его полезности и важности его наличия в системе.