web-dev-qa-db-ja.com

文字列を文字列(複数文字)の区切り文字で配列に分割するにはどうすればよいですか?

基本的には、たとえばsep.のような文字列区切り文字で文字列を配列に分割したいと思います。 bashsedなどのツールを使用せずにこれを行うネイティブのawk方法はありますか? IFSを設定してread -raを使用することで文字列を配列に分割できることはわかっていますが、文字列区切り文字では機能しません。そして、sedawkなどのツールでそれを行う方法がない場合はどうなりますか?

文字列This is some sep.stringがあり、それをThis is somestringの2つの要素を持つ配列に分割したいとします。

1
FieryRider

パラメータ展開を使用して、変数を手動で繰り返すことができます。

#!/bin/bash
var='This is some sep.string
with
newlines
sep.another line'

a=()
while [[ $var =~ sep\. ]]
do
  e=${var%%sep.*}
  a+=("${e}")
  var=${var#${e}sep.}
done
a+=("${var}")

これは変数をループし(プロセスで更新し)、最初のセパレーターを取り除きます(%%は最長の一致を探すため、文字列の終わりからsep.の最初のインスタンスまで逆方向に追跡します)。その剰余を配列に追加してから、その剰余とセパレーターを変数の前から取り除きます。変数にセパレータが含まれなくなるまで繰り返し、余りを配列に追加します。

1
Jeff Schaller

パラメータ展開とreadarrayの両方を使用してそれを行うためのネイティブな方法の一種

string='This is some sep.string'
mapfile -t array < <( echo "${string//sep./$'\n'}" )

${string//sep./$'\n'}-sep.の出現箇所を改行に置き換えます。 mapfile/readarrayは、独自の要素に各行を含む配列を作成します。

1
jesse_b