2017-12-18 8 views
0

複数の文字列を返すシェルスクリプトでコマンドを使用しています。それぞれの文字列は""で囲まれています。これらの文字列を配列の別々の要素として必要とするため、このように、区切り文字として"を使用して文字列:空の文字列を作成する "

IFS='"' 
arr=($(command that returns multiple strings enclosed in "")) 

、各文字列の先頭に"文字があるので、私のスクリプトは、空の文字列と文字列自体に、各文字列を分割たとえば、。文字列"foo" "bar"は、(空文字列)、foo(空文字列)、bar。分割しながら、

  1. は、どういうわけか、空白を取り除く:だから、私の配列ではなく、2

    のがあり、これを克服するための二つのアプローチすることができ、いずれかの実装に任意のヘルプは参考になる、4つの要素を持って終わります。

  2. 空白で配列を作成し、別の配列を作成し、その要素を空白以外の2番目の配列に挿入するだけです。

解決策としてbashとkshの両方にタグ付けをしていますが、解決策としてはbashも許容されます。ありがとう!あなたがを分割している引用符で囲まれた文字列場合を行う

array=() 
while IFS= read -r -d '' piece; do 
    array+=("$piece") 
done < <(command-that-returns-multiple-quoted-strings | xargs printf '%s\0') 

:引用符で囲まれた文字列が改行を含んでいない限り

+0

'arr =($(...))'は最初から悪い習慣です。効果的に*決してそれは何かがすべき場所です。 –

+0

出力を制御できれば、 'eval arr =($(echo '" foo "" bar "'))' 'を使うことができます。これは、例えば 'eval arr =($(echo '" foo "" $(echo dangerous) "))'のように潜在的に危険です。 ' – PesaThe

+0

(区切り文字で単語を分割したい場合は、代わりに' IFS = '"' read -r -a arr <<<" $ string "'を使用してください - そうすることでglob拡張が回避されます。しかし、シェル引用された内容を解析する)。 –

答えて

2

、あなたは言葉のNUL区切りのリストにあなたの引用符で囲まれた文字列を処理するためにxargsを使用することができます改行を含むと、xargsは正しく動作しません。 bash 4.4で

arr=(); 
while IFS= read -r -d '' item; do 
    arr+=("$item"); 
done < <(cmd | gawk -v RS='"[^"]*"' 'RT { gsub("\"", "", RT); printf RT"\0"}'); 

か:あなたは、二重引用符で囲まれた文字列を格納し、残りを無視したい場合は、ここでは正しく<newline>を扱うawkソリューションである

shell_quotes_to_NULs() { 
    python -c ' 
import sys, shlex 
for piece in shlex.split(sys.stdin.read()): 
    sys.stdout.write(piece) 
    sys.stdout.write("\0") 
' 
} 

array=() 
while IFS= read -r -d '' piece; do 
    array+=("$piece") 
done < <(command-that-returns-multiple-quoted-strings | shell_quotes_to_NULs) 
1

:代わりにPythonの標準ライブラリshlex moduleを考えます後で:

readarray -d '' arr < <(cmd | gawk -v RS='"[^"]*"' 'RT { gsub("\"", "", RT); printf RT"\0"}') 
+0

これは、展開前にグロブをオフにしない限り、 '' * ''をカレントディレクトリのファイル名のリストに置き換えます。 –

+0

@CharlesDuffyうん。急いで試してみたところ、正常に動作していなかった...私は ' 'を受け入れる解決策を考え出し、私の答えを更新した。 – PesaThe

+0

私はまだawkのアプローチを比較的脆弱と呼んでいる。汎用ユースケースに置く。私が '' foo bar "" baz qux "one \ two three" "four"でテストした場合、出力に 'one'、' two'、 'three'または' four'のいずれも存在しません。 xargsはそれを大丈夫だ。 –

関連する問題