我正在处理一个包含以下形式的一些语句的文本文件
'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 版本慢很多。