20

私は、次のことを目標とする複雑なスクリプトを作成しようとしています。次のような文字列が入ってきます。

2012 2013 "multiple words"

私の目標は、これらのそれぞれをスペースで区切られた配列に入れることですが、単一の単語の一致のみであり、二重引用符で囲まれたものではありません。それらは1つの単語と見なされるべきです。だから私の考えは、これを2つのステップで行うことでした。最初に倍数である単語に一致し、それらを文字列から削除してから、別の繰り返しで空白で分割します。
残念ながら、私はecho一致する方法についてのみヘルプを見つけることができません. これまでのところ、私はこれを持っています:

array=$(echo $tags | sed -nE 's/"(.+)"/\1/p')

しかし、これは(OS X上で)次のようになります:

2012 2013 multiple words

期待される結果:

array[1]="2012"
array[2]="2013"
array[3]="multiple words"

この種の問題についてどうすればよいでしょうか?

ありがとう。

4

5 に答える 5

20

eval悪ですが、これは便利なケースの1つかもしれません

str='2012 2013 "multiple words"'
eval x=($str)
echo ${x[2]}
multiple words

bashまたは(4.3でテスト済み)のより最近のバージョンで

s='2012 2013 "multiple words"'
declare -a 'a=('"$s"')'
printf "%s\n" "${a[@]}"
2012
2013
multiple words
于 2013-06-27T15:05:45.453 に答える
1

以下は、あなたが望む結果を生成します:

tags='2012 2013 "multiple words"'
IFS=$'\n'; array=($(echo $tags | egrep -o '"[^"]*"|\S+'))

結果は ZSH になります。

echo ${array[1]} # 2012
echo ${array[2]} # 2013
echo ${array[3]} # "multiple words"

BASH の結果:

echo ${array[0]} # 2012
echo ${array[1]} # 2013
echo ${array[2]} # "multiple words"

OSXで動作します。

于 2013-06-27T14:44:47.890 に答える
0

引用符で囲まれたフィールドを尊重しながら、スペースで区切られた csv を解析する小さな Python スクリプトを次に示します。

$ python -c '
import csv, fileinput
for line in csv.reader(fileinput.input(), delimiter=" "):
   for word in line:
      print word
' test.csv
2012
2013
multiple words

これは fileinput モジュールを使用するため、パイプライン (または変数内の文字列) でも機能します。

$ str='2012 2013 "multiple words"'
$ echo $str | python -c '
import csv, fileinput
for line in csv.reader(fileinput.input(), delimiter=" "):
   for word in line:
      print word
' 
2012
2013
multiple words
于 2015-01-22T16:15:17.313 に答える