На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 30.04.2010 23:51
Что то и я стормозил
В седе -n и p все равно не используются. Итого - короче на 5 символов + убирание двоеточия в конце исправил -2, т.е. уже 62:
Код: Выделить всё
ls -lR|sed '/^.\//h;G;s/\n/ /;s_:$_/_'|awk '/^-/{print $9$8}'
t.t писал(а): ↑ 30.04.2010 21:00
А с пробелами?
Думаю пока, то что есть длинновато получается.
POSIX несовместимо, но вроде не очень длинно. Обошелся без ока. Правда шелла под рукой проверить нету.
Код: Выделить всё
ls -lR|sed -r '/^.\//h;G;s/\n/ /;s_:$_/_;/^-/!d;s_(.*\s+)7+(.*) (\./.*)_\3\2_'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 01.05.2010 06:55
/dev/random писал(а): ↑ 30.04.2010 22:51
Кстати, я предполагал, что это не сохраняется в файл, а вводится в ком. строке, и никакие $0, естественно, невозможны.
Почему? Такого в условиях не было. Более того: это предположение косвенно опровергается обсуждением sha-bang в первых постах темы.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 01.05.2010 07:03
И опять торможу: $i -- это ведь файл. Не надо никакого echo, достаточно ls.
-2
62, 74
Код: Выделить всё
ls -A "$1"|while read i;do i="$1/$i";[ -d "$i" ]&&. $0 "$i"||ls "$i";done
Код: Выделить всё
for i in `ls -A $1`;do i=$1/$i;[ -d $i ]&&. $0 $i||ls $i;done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 01.05.2010 08:33
/dev/random писал(а): ↑ 30.04.2010 18:30
если убрать ненужные пробелы, 62 символа.
SLEDopit писал(а): ↑ 30.04.2010 23:51
т.е. уже 62:
t.t писал(а): ↑ 01.05.2010 07:03
62
Вот и ищи теперь победителя:
Мало того, что все три предложенных варианта одинаковы по длине, так еще и попадают в разные категории (:
зы с пробелами:
Код: Выделить всё
ls -AR|sed -r '/^.\//h;G;s/\n/ /;/: /d;s_:$_/_;s_(.*) (\./.*)_\2\1_'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 01.05.2010 10:00
SLEDopit писал(а): ↑ 01.05.2010 08:33
Вот и ищи теперь победителя:
Мало того, что все три предложенных варианта одинаковы по длине, так еще и попадают в разные категории (:
Будем считать, что это была разминка. (;
Кто придумает следующее задание?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 01.05.2010 21:37
По решению /dev/random есть два замечания. С одной стороны, в нём есть ошибка, на которую я указал сразу: в опциях [ вместо -f должно быть ! -d. С другой -- он забыл при подсчёте убрать пробелы вокруг &&. Итого так на так. (:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 01.05.2010 21:43
А я, оказывается, при подсчёте забыл убрать перевод строки.
Код: Выделить всё
$ echo -n 'for i in `ls -A $1`;do i=$1/$i;[ -d $i ]&&. $0 $i||ls $i;done' | wc -c
61
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 01.05.2010 21:52
И последний аккорд: странно, что никто не догадался внести в решение от /dev/random моё последнее улучшение. Раз так, сделаю это сам:
Код: Выделить всё
$ echo -n 'shopt -s globstar;for i in **;do [ ! -d "$i" ]&&ls "$i";done' | wc -c
60
t.t писал(а): ↑ 01.05.2010 21:52
И последний аккорд: странно, что никто не догадался внести в решение от /dev/random моё последнее улучшение. Раз так, сделаю это сам:
Код: Выделить всё
$ echo -n 'shopt -s globstar;for i in **;do [ ! -d "$i" ]&&ls "$i";done' | wc -c
60
Не последний. Опять сразу не сообразил:
Код: Выделить всё
$ echo -n 'shopt -s globstar;for i in **;do [ -d "$i" ]||ls "$i";done' | wc -c
58
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 04.05.2010 00:50
t.t писал(а): ↑ 01.05.2010 10:00
Кто придумает следующее задание?
Что, так никто ничего придумывать не хочет? (:
Давайте вот такую сделаем:
Определить есть ли повторяющаяся последовательность в строке и вывести ее:
Код: Выделить всё
'aaaaaa' -> 'a'
'ababab' -> 'ab'
'ababaa' -> 'ababaa'
мое решение - 85 символом вместе с ша-бангом. но мне пока не следует выкладывать, да?)
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 04.05.2010 08:55
SLEDopit писал(а): ↑ 04.05.2010 00:50
t.t писал(а): ↑ 01.05.2010 10:00
Кто придумает следующее задание?
Что, так никто ничего придумывать не хочет? (:
Давайте вот такую сделаем:
Определить есть ли повторяющаяся последовательность в строке и вывести ее:
Не совсем для shell задачка. Скорее для sed.
SLEDopit писал(а): ↑ 04.05.2010 00:50
Код: Выделить всё
'aaaaaa' -> 'a'
'ababab' -> 'ab'
'ababaa' -> 'ababaa'
Т.е. ищется последовательность только начинающаяся с первого символа? Иначе в последнем случае было бы 'baba'.
SLEDopit писал(а): ↑ 04.05.2010 00:50
мое решение - 85 символом вместе с ша-бангом. но мне пока не следует выкладывать, да?)
Это на Ваше усмотрение. Я своё решение не выкладывал сразу, т.к. понимал, что у той задачи есть много различных вариантов решения и не хотел сразу направлять ход событий в какое-то одно русло. Здесь, на мой взгляд, ситуация в этом смысле иная: кроме sed ничего в голову не приходит.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 04.05.2010 10:09
t.t писал(а): ↑ 04.05.2010 08:55
Не совсем для shell задачка. Скорее для sed.
А я вот на чистом шелле решил:
Код: Выделить всё
#!/bin/bash
for N in `seq ${#1}`
do
D=${1:0:$N}
[ -z ${1//$D/} ]&&echo $D&&exit
done
t.t писал(а): ↑ 04.05.2010 08:55
Т.е. ищется последовательность только начинающаяся с первого символа?
Я думаю да. Хотя задача ненамного усложнится, если искать последовательность начиная с любого символа. Просто иначе начинают возникать всякие спорные ситуации:
'ababaa' -> 'ababaa' - последовательность ba [ в
а babа
а ] или а [ в
abab аа ] или аb [ в abab
аа ].
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 04.05.2010 12:37
А, так это вообще не то, что Вы сказали. Это не "есть ли повторяющаяся последовательность в строке", а "является ли вся строка последовательностью повторов". Т.е. значительно более простая задача. Я, правда, мог бы понять и сразу, т.к. иначе в Вашем последнем примере всё равно была бы повторяющаяся подстрока: ab (видать, тогда ещё не совсем проснулся).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 04.05.2010 12:59
Нда, немного некорректно выразился (:
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 04.05.2010 17:57
Хотел было написать, что задача настолько простая, что улучшить уже не получится. Но один символ всё-таки смог убрать. (:
Код: Выделить всё
#!/bin/bash
for N in `seq ${#1}`
do
D=${1:0:$N}
[ -z ${1//$D} ]&&echo $D&&exit
done
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Red User
Сообщения: 229
ОС: Debian
Сообщение
Red User » 08.05.2010 04:00
Ещё немного короче:
Код: Выделить всё
#!/bin/bash
for N in `seq ${#1}`
do
D=${1:0:$N}
[ ${1//$D} ]||break
done
echo $D
А лучше так:
Код: Выделить всё
#!/bin/bash
while D=${1::((++N))};[ ${1//$D} ]
do
:
done
echo $D
Во втором варианте, правда, могут быть проблемы, если N до выполнения скрипта чему-нибудь равно.
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 08.05.2010 06:42
Да, хорошие варианты. Всё время забываю, что -n для test можно не указывать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Red User
Сообщения: 229
ОС: Debian
Сообщение
Red User » 08.05.2010 14:06
Рекурсивный вариант:
Код: Выделить всё
#!/bin/bash
D=${1::((++N))}
[ ${1//$D} ]&&. $0 $1||echo $D
А ведь когда-то не боялись мы программы любой,
И с одним лишь debug'ом выходили на бой,
И искусно написанный вирус встречали как брата
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 08.05.2010 16:52
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 08.05.2010 17:04
Я и говорил, что это для sed, а не для shell задачка. (: Название темы как бы намекает, что решения на чистом sed скорее вне конкурса.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 08.05.2010 17:33
Только у тебя ошибочка вышла. В варианрте автора вся строка тоже выводится как единичное "повторение". Так что на самом деле на два символа короче:
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux
Сообщение
watashiwa_daredeska » 08.05.2010 18:12
t.t писал(а): ↑ 08.05.2010 17:04
Я и говорил, что это для sed, а не для shell задачка.
А для shell — это на работу с ФС, процессами и т.п. На обработку текста почти всё — sed или awk.
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE
Сообщение
t.t » 08.05.2010 18:38
watashiwa_daredeska писал(а): ↑ 08.05.2010 18:12
t.t писал(а): ↑ 08.05.2010 17:04
Я и говорил, что это для sed, а не для shell задачка.
А для shell — это на работу с ФС, процессами и т.п. На обработку текста почти всё — sed или awk.
Ну да. В отдельных случах shell с coreutils и/или grep будет проще лбибо эффективнее, но не часто.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж