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ąć ...

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.