87

私はこれを見つけまし

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

x='some
   thing'

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

運が悪かったので、二重のバックスラッシュでうまくいくと思いました:

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

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

テストするには、私がやりたいことが得られません:

echo ${y[1]}

取得:

some
thing

私がなりたいもの:

some

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

4

2 に答える 2

142

別の方法:

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'. 機能させるには、解析する前に単語区切りを制限する必要があります。

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

...そして、セパレーターを変更しているので、をに変換する必要は\nもうspaceないので、次のように単純化できます。

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

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

于 2013-11-04T16:17:04.173 に答える
6

最初の改行までのテキストだけが必要な場合は、別の方法があります。

x='some
thing'

y=${x%$'\n'*}

その後は何もy含まれsomeません (改行なし)。

ここで何が起きてるの?

最初のANSI C ライン フィードまでの最短一致に対してパラメータ展開部分文字列の削除( )を実行し( )、それに続くすべてを削除します ( )。${PARAMETER%PATTERN}$'\n'*

于 2019-12-04T14:36:46.417 に答える