Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Bash: разбить преложение  (Прочитано 2015 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн aliftin

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Bash: разбить преложение
« : 31 Мая 2010, 23:08:16 »
Доброго времени суток.

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

a='gedit is a small and lightweigh1t text editor for the GNOME Desktop' #условная строка

#тут мы разбиваем ее на слова и заносим их в массив
for temp in $a
do
echo "${words_array[i]=$temp}"
let "i += 1"
done
words_limit=$i #число слов в исходном предложении
i=0    #обнуляем счетчик
j=0

#вот дальше пошли проблемы
while [ $i -le $words_limit ]    #проверяем, не достигнут ли лимит слов
do
if [ `expr "${#words_array[i]}" + "${#text_array[j]}"` -lt 20 ]
then
text_array[j]=`echo ${text_array[j]} ${words_array[1]}`
let "i += 1"
else
let "j += 1"
fi

done

На выходе получаю набор из "is". Не могу понять в чем проблема. Когда то на as2 такое делал, а вот с bash что то не могу.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #1 : 01 Июня 2010, 17:27:06 »
я бы мог реализовать это на питоне, если вы скажете что должно быть на выходе )))

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Bash: разбить преложение
« Ответ #2 : 02 Июня 2010, 20:37:25 »
Таки да, не понятно, что хотим получить в итоге.

Оффлайн aliftin

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #3 : 02 Июня 2010, 23:07:04 »
Ладно, постараюсь объяснить на пальцах. Есть предложение в переменной - "gedit is a small and lightweigh1t text editor for the GNOME Desktop". Нужно что бы на выходе бы сформирован массив такого содеражания:
a[0]=gedit is a small
a[1]=and lightweigh1t
a[2]=text editor for the
a[3]=GNOME Desktop

Каждое словосочетание содержит не более 20 символов (включая пробелы). Думаю так понятней.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #4 : 03 Июня 2010, 00:08:52 »
Помоему такое на баше не очень удобно делать, может действительно питон или перл для этого в несколько раз лучше подойдут.

Или это любопытство в духе, "а можно ли такое сделать только средствами баша"?

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Bash: разбить преложение
« Ответ #5 : 03 Июня 2010, 03:28:40 »
( a='gedit is a small and lightweight text editor for the GNOME Desktop'
i=0
b[$i]=""

for c in $a
do
    if [ $(echo "${b[$i]}$c" | wc -c) -gt 20 ]
    then
        ((i++))
        b[$i]=""
    fi
    b[$i]+="$c "
done

for (( j=0 ; j<=i ; j++ ))
do
    echo "${b[$j]}"
done )
Для проверки скопипастить в терминал целиком. %)

Знаю, что не айс, но в принципе работает.

Оффлайн aliftin

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #6 : 03 Июня 2010, 10:18:25 »
Нормально, как раз именно "айс", обошлись без мерзкого sed|awk. Спасибо ArcFi, очень помогло.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #7 : 04 Июня 2010, 11:47:18 »
мой вариант на питоне, так интереса ради накидал
a = "gedit is a small and lightweigh1t text editor for the GNOME Desktop"
d = ""
e = []

for c in a.split(" "):
    if len(d) + len(c) < 19:
        d += " " + c
    else:
        e.append(d)
        d = c

print(e)

а можно поинтересоваться где вы хотите это использовать?
« Последнее редактирование: 04 Июня 2010, 12:39:34 от Владимир Николаевич »

Оффлайн aliftin

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #8 : 05 Июня 2010, 01:01:00 »
Да конечно. У меня плохая память и постоянно приходится все записывать. В файл писать мне не нравится, а все программы с липкими записками меня не устраивают, так как сидят в памяти или странные. Вот у меня появилась идея реализовать это средствами bash.

Имеется 2 скрипта: add_note.sh и del_note.sh. Понятно что они делают - добавляют и удаляют заметки с рабочего стола. Они еще не особо работоспособны, по ходу пользования допишу нужные мне функции.

И так мы создаем в домашней папке рабочий каталог ".bash_notes", а в нем еще три каталога - "resource", "notes" и "temp". Думаю понятно из названия для чего они нужны. Так же нам потребуется создать файл "config.cfg" в папке ".bash_notes" такого содержания:

(Нажмите, чтобы показать/скрыть)

Шрифт указываем свой, размер текста тоже по усмотрению.

В папку "resource" сохраняем картинку нашей заметки:


Все, теперь переходим к скриптам. Их сохраняем под соответствующими именами и кидаем например в "/usr/bin".

(Нажмите, чтобы показать/скрыть)

(Нажмите, чтобы показать/скрыть)

В основном я все прокоментил, думаю трудностей возникнуть не должно. Если есть конструктивные предложения или видите явные ошибки, пишите, подправим.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

tartan

  • Гость
Re: Bash: разбить преложение
« Ответ #9 : 08 Июня 2010, 01:52:56 »
Можно ввод через zenity сделать... Наверное. И вывод через conky (точно).

Оффлайн ende_neu

  • Старожил
  • *
  • Сообщений: 2473
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #10 : 08 Июня 2010, 02:09:51 »
echo "gedit is a small and lightweigh1t text editor for the GNOME Desktop"|fold -s -w 10
gedit is
a small
and
lightweigh
1t text
editor
for the
GNOME
Desktop

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
Re: Bash: разбить преложение
« Ответ #11 : 08 Июня 2010, 05:06:57 »
fold
Вот знал же, есть готовое решение. :)

Оффлайн truegeek

  • FPGA Designer
  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 4214
  • аЦкий схемотехник
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #12 : 08 Июня 2010, 08:34:53 »
echo "gedit is a small and lightweigh1t text editor for the GNOME Desktop"|fold -s -w 10
круть...

Оффлайн aliftin

  • Автор темы
  • Старожил
  • *
  • Сообщений: 1398
    • Просмотр профиля
Re: Bash: разбить преложение
« Ответ #13 : 08 Июня 2010, 10:09:04 »
zenity не то, это нужно минимум 3 окна, а это не совсем удобно мне кажется. Да, вариант ende_neu очень не плох, но уже лень переписывать.
Если мы не можем до чего то дотянуться, мы виним в этом не свой рост, не отсутствие табуретки, а свою цель.

 

Страница сгенерирована за 0.07 секунд. Запросов: 25.