2012-07-31 4 views
13

私は、次の形式で文字列を持っている:文字「 n」を含む複数行の文字列をbashの文字列の配列に分割する方法は?

$ echo "${ARRAY[0]}" 
I'm\nNed\nNederlander 

$ echo "${ARRAY[1]}" 
I'm\nLucky\nDay 

$ echo "${ARRAY[2]}" 
I'm\nDusty\nBottoms 

は、しかし、私は:

I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms 

は私がそのようなことを線で文字列ラインの配列にこれを移動したいと思います文字列自体の中の "\ n"文字に問題があります。それらは文字列の中で二つの別個の文字、バックスラッシュと 'n'で表されますが、私が配列分割をしようとすると、それらは改行として解釈されます。したがって、IFSの典型的な文字列分割は機能しません。例えば

$ read -a ARRAY <<< "$STRING" 
$ echo "${#ARRAY[@]}" # print number of elements 
2 

$ echo "${ARRAY[0]}" 
I'mnNednNederla 

$ echo "${ARRAY[1]}" 
der 
+0

をところで、誰もがSEの問題を解決する方法を知っているん上のコードのひどいフォーマット? –

+0

「ひどい書式設定」は、アポストロフィが一重引用符(均等になると予想される)として解釈されるためです。 "code"タグの代わりに "block quote"タグを使用してください。 – twalberg

答えて

24

デフォルトでは、read組み込みは、\は文字をエスケープすることができます。この動作をオフにするには、-rオプションを使用します。 -rを使用したくない場合がよくあります。 1行でこれを行うためには

string="I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms" 

arr=() 
while read -r line; do 
    arr+=("$line") 
done <<< "$string" 

(あなたがread -aと試みていたよう)、実際にはbash V4以上でmapfileが必要です。

mapfile -t arr <<< "$string" 
+0

えええええええええええええええええええええええええええええん: –

12

mapfileは、よりエレガントであるが、それは可能です(あなたが4よりも古いのbashのバージョンを使用している場合に便利)readと1(醜い)行でこれを行うには:

IFS=$'\n' read -d '' -r -a arr <<< "$string" 
+0

確かに、と-dオプションはそれを働かせるために重要だと思われる –

+0

私がこれを投稿したときに私が知らなかった1つの警告:ここの文字列は決して終わらないので終了ステータスはゼロではない'read -d ''のようなヌル文字が期待されます。 – chepner

関連する問題