如何在BASH中替换[10-15]到10 11 12..15

时间:2013-03-29 07:10:21

标签: bash

我有一个包含以下内容的文件/字符串:

[1-9]
[11-12]
[10-15]

然后我想扩展它成为这个:

1 2 3 4 5 6 7 8 9
11 12
10 11 12 13 14 15

我知道如何在很长的路上完成它(首先捕获两个数字,然后使用for循环展开它们。)

我想知道是否有更快/更聪明的方法来实现同样的目标。

4 个答案:

答案 0 :(得分:2)

单向:(纯粹的bash解决方案)

while IFS=- read l1 l2
do
   eval echo ${l1/[/{}".."${l2/]/}}
done < file

答案 1 :(得分:1)

有几种解决方案。

解决方案1:

sed 's/^/echo /; s/[[]/{/; s/]/}/; s/-/../' | bash

示例:

$ cat 1.txt | sed 's/^/echo /; s/[[]/{/; s/]/}/; s/-/../' | bash
1 2 3 4 5 6 7 8 9
11 12
10 11 12 13 14 15

解决方案2:

tr '[]-' ' ' | sed "s/^/seq -s' '/" | bash

示例:

$ cat 1.txt | tr '[]-' ' ' | sed "s/^/seq -s' '/" | bash
1 2 3 4 5 6 7 8 9
11 12
10 11 12 13 14 15

答案 2 :(得分:0)

如果您确信您的输入符合该模式:

while read a; do
  seq -s' ' $(echo "$a" | tr '[]-' ' ')
done

根据需要添加错误检查。

答案 3 :(得分:0)

这是一个单行:

cat lines | sed -E -e 's/\[|]//g' -e 's/-/ /g' | xargs -n 2 seq -s ' ' -t '\n'

如:

$ cat <<EOF | sed -E -e 's/\[|]//g' -e 's/-/ /g' | xargs -n 2 seq -s ' ' -t '\n'
> [1-9]
> [11-12]
> [10-15]
> EOF
1 2 3 4 5 6 7 8 9
11 12
10 11 12 13 14 15