基本的には、たとえばsep.
のような文字列区切り文字で文字列を配列に分割したいと思います。 bash
、sed
などのツールを使用せずにこれを行うネイティブのawk
方法はありますか? IFS
を設定してread -ra
を使用することで文字列を配列に分割できることはわかっていますが、文字列区切り文字では機能しません。そして、sed
、awk
などのツールでそれを行う方法がない場合はどうなりますか?
文字列This is some sep.string
があり、それをThis is some
とstring
の2つの要素を持つ配列に分割したいとします。
パラメータ展開を使用して、変数を手動で繰り返すことができます。
#!/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.
の最初のインスタンスまで逆方向に追跡します)。その剰余を配列に追加してから、その剰余とセパレーターを変数の前から取り除きます。変数にセパレータが含まれなくなるまで繰り返し、余りを配列に追加します。
パラメータ展開とreadarrayの両方を使用してそれを行うためのネイティブな方法の一種
string='This is some sep.string'
mapfile -t array < <( echo "${string//sep./$'\n'}" )
${string//sep./$'\n'}
-sep.
の出現箇所を改行に置き換えます。 mapfile
/readarray
は、独自の要素に各行を含む配列を作成します。