Я обрабатываю текстовый файл, который имеет несколько операторов вида

'0'...'7' 

или же

'0'...'9'

или даже

'a'...'j'

(идиома «...» появляется только в этих структурах), которую я хотел бы преобразовать в утверждения вида ...

 '0' '1' '2' '3' '4' '5' '6' '7'

Я могу сделать это с Вимом Маркосом, достаточно мило, или подбить немного Python, но я бы хотел сделать это из командной строки. Могу ли я получить рекомендуемую отправную точку? Я подозреваю, что есть какое-то волшебное действие, которое можно сделать, но я не могу обдумать это ...

2 ответа2

3

В bash есть оператор последовательности, который вы можете использовать:

sequence () { 
    read start finish <<< "${1/.../ }"
    start=${start//\'/}
    finish=${finish//\'/}
    eval echo {$start..$finish}
}
while read line; do
    sequence "$line"
done << END
'0'...'7' 
'0'...'9'
'a'...'j'
END
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8 9
a b c d e f g h i j

Я должен использовать eval потому что bash попытается расширить последовательность до того, как расширит переменные. См. Http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions.

0

Предполагая, что последовательности всегда возрастают;

$ cat input alphabet
'0'...'7'
'0'...'9'
'a'...'j'
0123456789abcdefghijklmiopqrstuvwxyzj

tr \'. '  ' <input  | 
while read f t ; do 
    grep -Po "$f.*?$t" alphabet;
done

01234567
0123456789
abcdefghij

Это, вероятно, намного медленнее, чем версия bash-eval.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .