21

次の形式 の文字列があります。

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

これを次のように1行ずつ文字列の配列に移動したいと思います。

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

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

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

ただし、文字列自体の「\n」文字に問題が発生しています。これらは文字列内でバックスラッシュと「n」の2つの別個の文字として表されますが、配列分割を実行しようとすると、改行として解釈されます。したがって、通常の文字列分割はIFS機能しません。

例えば:

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

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

$ echo "${ARRAY[1]}"
der
4

2 に答える 2

35

デフォルトでは、readビルトインは\が文字をエスケープすることを許可します。この動作をオフにするには、-rオプションを使用します。を使いたくない場合はめったにありません-r

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

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

これを1行で行うには(で試みたようにread -a)、実際にはmapfilebashv4以降が必要です。

mapfile -t arr <<< "$string"
于 2012-07-31T17:56:13.967 に答える
15

mapfileよりエレガントですが、これを1つの(醜い)行で行うことができreadます(4より古いバージョンのbashを使用している場合に便利です):

IFS=$'\n' read -d '' -r -a arr <<< "$string"
于 2012-08-23T02:06:01.843 に答える