以下を含むファイル/文字列があります。
[1-9]
[11-12]
[10-15]
次に、それを拡張して次のようにします。
1 2 3 4 5 6 7 8 9
11 12
10 11 12 13 14 15
私は非常に長い方法でそれを行う方法を知っています (最初に 2 つの数値を取得し、次に for ループを使用して展開します)。
同じことを達成するためのより高速でスマートな方法があるかどうかを知りたいです。
以下を含むファイル/文字列があります。
[1-9]
[11-12]
[10-15]
次に、それを拡張して次のようにします。
1 2 3 4 5 6 7 8 9
11 12
10 11 12 13 14 15
私は非常に長い方法でそれを行う方法を知っています (最初に 2 つの数値を取得し、次に for ループを使用して展開します)。
同じことを達成するためのより高速でスマートな方法があるかどうかを知りたいです。
一方向:(純粋なbashソリューション)
while IFS=- read l1 l2
do
eval echo ${l1/[/{}".."${l2/]/}}
done < file
いくつかの解決策があります。
解決策 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
入力がすべてそのパターンに一致することが確実な場合:
while read a; do
seq -s' ' $(echo "$a" | tr '[]-' ' ')
done
必要に応じてエラー チェックを追加します。
ここにワンライナーがあります:
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