LINUX.ORG.RU

bash. array. удаление элемента.


0

1

привет.

читаю это: http://tldp.org/LDP/abs/html/arrays.html

в одном из приведенных примеров имеется такой фрагмент:

# Removes shortest match from front of string(s).
echo ${arrayZ[@]#f*r}   # one two three five five
#               ^       # Applied to all elements of the array.
                        # Matches "four" and removes it.

# Longest match from front of string(s)
echo ${arrayZ[@]##t*e}  # one two four five five
#               ^^      # Applied to all elements of the array.
                        # Matches "three" and removes it.

в чем принципиальная разница между этими двумя способами? результат-то одинаковый.

спасибо.

★★★

Последнее исправление: niXman (всего исправлений: 1)

# в первом случае удаляет самый короткий элемент, совпадающий с шаблоном

## во втором случае удаляет самый длинный элемент, совпадающий с шаблоном

man bash, не ленись :)

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

неее, я понял о чем говорится в комментах. я не понял что подразумевается под «короткий»/«длинный».

уже потестил.

спасибо.

niXman ★★★
() автор топика

результат-то одинаковый.

Где же ты увидел одинаковый результат?

В первом примере удаляется найденный элемент four, а результат:

one two three five five

Во втором примере удаляется найденный элемент three, а результат:

one two four five five

Да и в комментах перед примерами что написано? Читал? :)

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

В первом примере удаляется найденный элемент four

ну так он единственный подходящий под шаблон «f*r». или что?

Да и в комментах перед примерами что написано? Читал? :)

конечно читал. даже потестил.

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

тут не man bash надо читать. А более общие книги о теории регулярных выражений. Дело в том, что выражение бывает жадным, а бывает не жадным (это официальные термины). Жадное выражение захватывает всё что сможет, а не жадное - только самый необходимый минимум. Например, Z* - если звёздочка жадная, то такое RE захватит все буквы Z, а если звёздочка не жадная, то она вообще ничего не захватит.

Вот # в баше не жадная, а ## - жадная.

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

Пардон, ступил. Сам не туда заехал и тебя с толку сбил. Значит, так: «всё, что я тут говорил - наплявать и забыть!» (С)(почти Чапай) :)

При использовании # в каждом элементе заданного массива будет искаться (и удаляться)самое короткое совпадение с заданным шаблоном. То есть:

при #f*r

от массива («one» «two» «three» «four» «five» «forever»)

останется

(«one» «two» «three» «five» «ever»)

А при ##t*e, как во втором примере, опять же в каждом элементе заданного массива ищется самое длинное (drBatty верно говорит - «жадный» алгоритм поиска) совпадение с шаблоном.

Вот теперь вроде всё так.

PS: Спасибо, что заставил вспомнить обработку данных в массивах в bash. :)

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

PS: Спасибо, что заставил вспомнить обработку данных в массивах в bash. :)

ИЧСХ, массивы тут совсем не причём ;)

В скалярах точно так же.

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

Да здесь по большому счёту и скаляры ни при чём.

Там общее правило:

${parameter#word} - нежадный алгоритм поиска шаблона word в parameter

${parameter##word} - жадный алгоритм поиска шаблона word в parameter

А в качестве parameter можно и массив подсунуть, и скаляр, и строку, емнип.

OldFatMan
()
Ответ на: комментарий от drBatty

В скалярах точно так же.

А в bash скаляры разве есть?

Я сейчас и выше говорю не про «регулярные выражения вообще», а про конкретный пример ТС с массивами в bash.

Так что в данном конкретном случае именно массивы тут «причём».

OldFatMan
()
Ответ на: комментарий от niXman

Да тут взаимная благодарность. ;)

Пока пытался объяснять, сам стал вспоминать - давно с массивами не возился - а тут твои примеры.

Между прочим, в man-е действительно все случаи и варианты нормально расписаны, так что ты не забывай, заглядывай туда почаще.

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