IFSおよび読み取りまたはその他の方法を使用して長い文字列を文字列配列に分割する方法

IFSおよび読み取りまたはその他の方法を使用して長い文字列を文字列配列に分割する方法

gitコマンドの出力である長い行がありますa=$(git submodule foreach git status)。次のようになります: a="enter'ディレクトリ1/サブディレクトリ'あなたのブランチがブランチマスターから「オリジナル/マスター」に更新されました。コミットする内容がなく、作業ツリーのクリーンアップ入力ディレクトリ2「HEADはxxxxxxから分離されており、何もコミットする必要はなく、作業ツリーがきちんと入力されました。」目次3'あなたのブランチがブランチマスターから「オリジナル/マスター」に更新されました。コミットする内容がなく、作業ツリーのクリーンアップ入力目次4'あなたのブランチがブランチマスターから「オリジナル/マスター」に更新されました。約束することもなく、職業ツリーも綺麗だ」

私はそれを配列に分割したいと思います:

ARR[0] = "'ディレクトリ1/サブディレクトリ「支部長について...」

ARR[1] = "'ディレクトリ2「頭が落ちた…」

など。

そのために、シンボルの代わりに「Entering」を試してみました(#$%&\ t ...を使ってみました)。a=${a//Entering /$}正常に動作しました。次に、IFSを使用して配列に読み込もうとします。IFS='$' read -ra ARR <<< "$a"

これが私が問題に直面しているところです。

私が得る出力echo ${ARR[@]}は "Dir1 / Subdir1"なので、読み取りが空白やgitの出力方法の影響を受けているようですが、何が起こっているのか、どのように解決するのかわかりません。アドバイスをすることができますか?

ありがとうございます。

ベストアンサー1

readarraybash 組み込みコマンドを使用し、同じコマンドに区切り文字を指定できます。

readarray -d 'char delimiter' array <<< $variable

たとえば、

readarray -d '@' array <<< ${a//Entering /@}

最後に、各結果を印刷するときに削除したり、@区切り文字として使用されている他の文字を削除したりできます。

echo ${array[1]%@}
echo ${array[2]%@}
echo ${array[@]%@}

インデックスを削除したい場合0(が含まれているため@)、インデックスのエントリを最後のインデックスにコピーして配列を再割り当てできます1

array=("${array[@]:1}")

ヒント:${array[index]%@}一部のアイテムをインポートしたい場合はいつでも配列を使用したくない場合は、次の項目を@削除して配列を再割り当てできます。

array=("${array[@]/@}")

おすすめ記事