web-dev-qa-db-ja.com

改行文字によるbash文字列の分割

this が見つかりました。

そして私はこれを試しています:

x='some
   thing'

y=(${x//\n/})

そして、私は運がなかった、それは二重バックスラッシュで動作するだろうと思った:

y=(${x//\\n/})

しかし、そうではありませんでした。

テストするために、私がやりたいことを得ていない:

echo ${y[1]}

取得:

some
thing

私がなりたいもの:

some

yを配列[some, thing]にしたい。これどうやってするの?

49
juanpastas

別の方法:

x=$'Some\nstring'
readarray -t y <<<"$x"

または、bash 4がない場合は、bash 3.2と同等です:

IFS=$'\n' read -rd '' -a y <<<"$x"

最初に使用しようとしていた方法でも実行できます。

y=(${x//$'\n'/ })

ただし、文字列に'line 1\nline 2'などのスペースが既に含まれている場合、これは正しく機能しません。動作させるには、解析する前にWordの区切り文字を制限する必要があります。

IFS=$'\n' y=(${x//$'\n'/ })

...そして、セパレータを変更しているので、\nspaceに変換する必要がなくなり、次のように単純化できます:

IFS=$'\n' y=($x)

このアプローチは機能しますnless$xには一致するグロビングパターン( "*"など)が含まれます。この場合、一致するファイル名に置き換えられます。 read/readarrayメソッドには新しいbashバージョンが必要ですが、すべての場合に機能します。

87
Sir Athos