パスを含むいくつかの文字列を処理する必要があります。/
これらの文字列を区切り文字に分割して未知のパス部分の数を生成する方法と、最終的に結果のパス部分を抽出する方法は?
cut
明らかに部品の数を事前に知っておく必要があり、各部品を出力して使用したり、配列で収集することができないreadarray
ためmapfile
、選択するツールではありません。
ベストアンサー1
でbash
単一文字の区切り記号の場合は、glob部分を無効にした後に分割+glob演算子を使用できます(リストコンテキストでは引用符なしで拡張を保持)。
string='foo/bar
baz/asd..'
IFS=/
set -o noglob
array=( $string )
でのみstring='/foo/'
分割されることに注意してください(分割と同じ)。 、および に分割するには、次のようにします。""
"foo"
string='/foo'
""
"foo"
""
IFS=/
set -o noglob
array=( $string'' )
それでもstring=''
ゼロ要素の代わりに空の要素に分割されます。
(zsh
split + globは/ emulationを除いて引用符なしの拡張を実行しません)、単一文字区切り文字に限定されないパラメータ拡張フラグを使用できます。sh
ksh
s
array=( ${(s[/])string} )
空の要素を削除するか、次の操作を行います。
array=( "${(@s[/])string}" )
空の要素は保持されます。/foo/
次にそれをに分割し""
、空の文字列をゼロ要素に分割します"foo"
。""
変数に格納されている区切り文字を使用して分割できます。
array=( "${(@ps[$delimiter])string}" )
このp
フラグを使用すると、エスケープシーケンス(たとえば、、)を入力することもできます\0
。これら2つのフラグには、改行から分割、NULから分割(たとえば、...の出力を分割するために使用できます)\n
という短縮フラグがあります。f
0
find -print0
grep -lZ
sort -z
files=( ${(0)"$(grep -lZ pattern -- *)"} )
では、zsh
次のこともできます。結ぶ指定された単一バイトを区切り文字として使用して、配列変数をスカラー変数に変換します。$path
inはzsh
実際にこのように区切り文字で囲まれた特別な配列です$PATH
(:
からインスピレーションを得ていますcsh
)。どの変数でもこれを実行できます。たとえば、次のようになります。
typeset -T string array /
配列と/
接続 - 分離。$string
$array