Пример преобразования форматов на BASH 4

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

Пример совсем несложный, я только что написал его для StackOverflow (где, к сожалению, люди всё ещё живут в криогенных камерах, не ведая о существовании BASH 4-й версии):

#!/bin/bash
inFile=$1
outFile=$2

join () {
 local del=$1
 shift
 IFS="$del"
 source <(
        cat <<SOURCE
 echo "\${$1[*]}"
SOURCE
 ) 
 unset IFS
}

declare -a CSV=('"Module Name","Module Group","Module Version"')
declare -a keysAccepted=('Name' 'Group' 'Version')

declare -i nMandatoryKeys=${#keysAccepted[@]}
declare -A KeyFilled
rxKeysAccepted='('$(join '|' keysAccepted)')'
while read line; do
        [[ $line =~ \<strong\>Module\ $rxKeysAccepted:\</strong\>[[:space:]]*([^<]+)\</p\> ]] || continue
        key=${BASH_REMATCH[1]}
        val=${BASH_REMATCH[2]}
        KeyFilled[$key]=$val
        if (( ${#KeyFilled[@]} == nMandatoryKeys )); then
                unset csvLine
                for k in ${keysAccepted[@]}; do
                        csvLine+=${csvLine:+,}${KeyFilled[$k]}
                done
                KeyFilled=()
                CSV+=($csvLine)
        fi
done <"$inFile"

(( ${#CSV[@]} > 1 )) || exit 1

join $'\x0a' CSV >"$outFile"


BASH-скрипт состоит из sed'ов, awk и grep'ов?
Давайте подсчитаем количество вхождений того, другого и третьего в данном примере!

Не спорю, тот же самый код на Perl, лучшем языке для работы с текстами, получился бы и короче намного, и быстрее.

Но, например, не нагляднее (Perl немного провоцирует писать супер-лаконичную абракадарбру). А является ли свойством BASH как языка программирования его действительно порой раздражающая медлительность — это ещё большой вопрос.

3 комментария

avatar
Выглядит круто. А что оно делает? )
avatar
Парсит строки HTML'я, выдёргивает из разных строк по частям запись, собирая все её части перед тем, как добавить очередную строку в массив CSV. Запись собирается в хэш KeyFilled. До тех пор, пока там не окажутся все 3 в данном случае поля — новая строка в CSV добавлена не будет. После же формирования новой строки хэш очищается, чтобы начала собираться новая строка.
avatar
Исходный файл выглядит так:

<p><strong>Module Name:</strong> google-http-client</p>
<p><strong>Module Group:</strong> com.google.http-client</p>
<p><strong>Module Version:</strong> 1.19.0</p>
<p><strong>Module Name:</strong> usndex-http-client</p>
<p><strong>Module Group:</strong> com.usndex.http-client</p>
<p><strong>Module Version:</strong> 0.10.2</p>
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.