2013-11-04 19 views
32

私はthisを見つけました。改行文字で区切られたbash文字列

そして、私はこれをしようとしていますが:

x='some 
    thing' 

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

そして、私は運がなかった、私はそれが二重のバックスラッシュで仕事ができると思った:

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

しかし、それはしませんでした。

echo ${y[1]} 

は行き方::

私はなりたい
some 
thing 

を:

some 

私はyがしたい私は私がやって欲しいものを得ていないのですテストするには

配列[some, thing]である必要があります。これどうやってするの?

+2

改行問題を解決すると、 'some {'}は '$ {y [1]}'ではなく '$ {y [0]}'になることに注意してください。 – chepner

答えて

55

別の方法:

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

それとも、あなたは、bashの3.2と同等のbashの4を持っていない場合:

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

またそれを最初に使用しようとしていた方法を行うことができます:

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

文字列に既に空白文字が含まれている場合は、など、これは正しく機能しません。。それを動作させるために、あなたはそれを解析する前に、単語の区切りを制限する必要があります:あなたは、セパレータを変更しているので、

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

...そして、あなたはもう\nspaceに変換する必要はありませんので、それがマッチしたファイル名(複数可)に置き換えられます。その場合には - (例えば、「*」など)グロブパターンマッチングが含まれてい$xない限り、このアプローチはに機能します

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

:あなたはそれを簡略化することができます。 read/readarrayのメソッドでは、より新しいbashバージョンが必要ですが、すべてのケースで機能します。

+1

拡張パターンで '\ n'と' \\ n 'のインスタンスが一致しません。代わりに '\ n' *リテラル*:' echo $ {x // $ '\ n' /} 'にスプライスする必要があります。 – mklement0

+0

@ mklement0:ありがとう、編集されました。 –

+2

'readarray'アプローチは実際には'($ x) 'がまだグロブの対象となっているため*最も堅牢な* *:有効な*単一トークン*グロブパターン(' * ')、ファイルが一致すると展開されます。 'readarray'はbash * 4 *を必要とします。ここでは、OS X上のものに相当する3.2のbashがあります: 'IFS = $ '\ n' read -rd" -a y <<< "$ x" 'あなたのポストは牽引力を得ているので、これらの発見を追加してもよろしいですか? – mklement0