konwersja „0”… „n” na „0” „1” na „n”

0

Przetwarzam plik tekstowy, który ma kilka instrukcji formularza

'0'...'7' 

lub

'0'...'9'

lub nawet

'a'...'j'

(idiom „...” pojawia się tylko w tych strukturach), które chciałbym przekonwertować na instrukcje formularza ...

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

Mogę to zrobić za pomocą vim marcos, całkiem uroczo lub podrzucić jakiegoś pytona, ale chciałbym to zrobić z wiersza poleceń. Czy mogę uzyskać zalecany punkt wyjścia? Podejrzewam, że jest trochę magii sed, którą można zrobić, ale nie mogę się tym zająć ...

Joe
źródło

Odpowiedzi:

3

bash ma operator sekwencji, którego możesz użyć:

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

Muszę użyć, evalponieważ bash spróbuje rozwinąć sekwencję, zanim rozszerzy zmienne. Zobacz http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions

Glenn Jackman
źródło
0

Zakładając, że sekwencje zawsze rosną;

$ 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

Jest to prawdopodobnie dużo wolniejsze niż wersja bash-eval.

Ярослав Рахматуллин
źródło