1

以下を含むファイル/文字列があります。

[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 ループを使用して展開します)。

同じことを達成するためのより高速でスマートな方法があるかどうかを知りたいです。

4

4 に答える 4

2

一方向:(純粋なbashソリューション)

while IFS=- read l1 l2
do
   eval echo ${l1/[/{}".."${l2/]/}}
done < file
于 2013-03-29T08:19:44.443 に答える
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
于 2013-03-29T07:24:22.127 に答える
0

入力がすべてそのパターンに一致することが確実な場合:

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

必要に応じてエラー チェックを追加します。

于 2013-03-29T07:14:16.617 に答える
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
于 2013-03-29T07:22:04.903 に答える