2016-12-23 1 views
2

私はタグIDリストを保存するブラックリストを持っています。 1-3,7-9、実際は1,2,3,7,8,9を表します。そして、以下のなぜ表現のためのシェルがxargsパラメータを正しく解析できないのですか?

for i in {1..3,7..9}; do for j in {$i}; do echo -n "$j,"; done; done 
1,2,3,7,8,9 

シェルによってそれを拡大する可能性がありますが最初に私はその後..

echo -n "1-3,7-9" | sed 's/-/../g' 
1..3,7..9 

-を変換解析できないパラメータとしてfor式に

echo -n "1-3,7-9" | sed 's/-/../g' | xargs -I @ for i in {@}; do for j in {$i}; do echo -n "$j,"; done; done 
zsh: parse error near `do' 

echo -n "1-3,7-9" | sed 's/-/../g' | xargs -I @ echo @ 
1..3,7..9 

が、for式をそれを置く必要がありますそれは正しく、なぜそうですか?

答えて

2

あなたはオユがxargsによって実行されることを意味することを特別なキーワードや文字(dofor$など)を拾ってからの最外殻を停止するために何もしなかったので。

xargsはシェル組み込みではありません。 引数からstdinの各要素に対して実行するコマンドラインを取得します。他のプログラムと同じように、;または他のシーケンス特殊文字を引数にbashにするには、何とかそれをエスケープする必要があります。

ここで本当に欲しいのは、私の考えでは、各入力要素に対してサブシェルにコマンド(ネストされたforループ)を呼び出すことです。

私はこれを思いついた。それは仕事にあるようです。

{1..3}、{7..9}を与え

echo -n "1-3,7-9" \ 
| sed 's/-/../g' \ 
| xargs -I @ \ 
bash -c "for i in {@}; do for j in {\$i}; do echo -n \"\$j,\"; done; done;" 

私はあなたがこれまでのところ、望んでいたものだと思いますか?

+0

より直感的ですありがとう!実際には '1-3,7-9'を' 1,2,3,7,8,9'に変換したいです。 – zhuguowei

0

この

# Mac newline need special treatment 
echo "1-3,7-9" | sed -e 's/-/../g' -e $'s/,/\\\n/g' | xargs [email protected] echo 'for i in {@}; do echo -n "$i,"; done' | bash 
1,2,3,7,8,9,% 


#Linux 
echo "1-3,7-9" | sed -e 's/-/../g' -e 's/,/\n/g' | xargs [email protected] echo 'for i in {@}; do echo -n "$i,"; done' | bash 
1,2,3,7,8,9, 

を達成するために、シェルの下に使用しますが、この方法を使用することができます少し複雑であるかもしれないawk

# awk 
echo "1-3,7-9,11,13-17" | awk '{n=split($0,a,","); for(i=1;i<=n;i++){m=split(a[i],a2,"-");for(j=a2[1];j<=a2[m];j++){print j}}}' | tr '\n' ',' 
1,2,3,7,8,9,11,13,14,15,16,17,% 
0
echo -n "1-3,7-9" | perl -ne 's/-/../g;$,=",";print eval $_' 
+0

答えにいくつかの説明を加えてください。 – plasmacel

関連する問題