将 '0'...'n' 转换为 '0' '1' 直到 'n'

将 '0'...'n' 转换为 '0' '1' 直到 'n'

我正在处理一个包含以下形式的一些语句的文本文件

'0'...'7' 

或者

'0'...'9'

甚至

'a'...'j'

(习语‘...’仅出现在这些结构中)我想将其转换为以下形式的语句...

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

我可以用 vim marcos 来做到这一点,合理地很可爱,或者敲一些 python,但我想从命令行执行。我可以得到一个推荐的起点吗?我怀疑有一些 sed 魔法可以做到,但我无法理解它……

答案1

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

答案2

假设序列总是上升的;

$ 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 版本慢很多。

相关内容