grep 一致を配列として保存

grep 一致を配列として保存

次の内容を含むファイルがあります。

FILETYPE=A:B:C:D

Linuxでkshスクリプトの配列としてgrep検索AしてB保存するC方法は?D頑張った

FILETYPES=`grep "FILETYPE" ${CONF_FILE} | awk -F: '{print $NF}'`

しかし、これは最後のものだけを得る。

答え1

GNU/Linux では、ksh93 または mksh (またはzshksh エミュレーションモード) を使用して次のことができます。

set -o noglob
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE" | tr ':' ' ') )

(デフォルト値と仮定$IFS

またはもっと慣用的に言えば:

set -o noglob
IFS=:
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE"))

配列名には小文字を使用していますが、これは一般に環境変数が大文字であるため安全です。コマンドの出力を配列として保存する方法は次のとおりです。

array=( $(command) )

globを無効にしてフィールド区切り文字を設定した後。

次に、コマンド自体grep(ここではGNUgrepまたはPerl準拠の正規表現サポートが有効になっていると仮定します())。これが意味するものを-P教えてくれます。\K「これまでの一致をすべて削除します。」。行の一致する部分だけを印刷するようにし、 と一緒に使用すると、その-o部分だけが印刷されます。最後に、デフォルト値の空白に置き換えます。grep\KA:B:C:Dtr:$IFS

$ printf '%s\n' "${filetypes[0]}"
A
$ printf '%s\n' "${filetypes[3]}" 
D

答え2

短い答え:

array=( `grep -Po '(?<=FILETYPE=).*$' $CONFIG_FILE | tr ':' ' '` )

説明: grep は、「FILETYPE=」の後ろにあるすべての項目を返すために「look Behind」アサーションを使用します。

結局、配列は次のように宣言されます。

array=(A B C D)

その後、テストします。

echo "${array[0]} ${array[1]} ${array[2]} ${array[3]}"

印刷:

A B C D

答え3

またはksh93mksh

{ read -rd=; IFS=: read -rA filetypes; } <file

上記のコマンドは最初に入力の最初の文字を{...;}読み込み、含めます。=入力のこの部分はREPLY変数に格納され、後でどの目的にも使用されません。その後、コードはそこから移動し、:-で区切られた文字列を配列に読み込みますfiletypes

-dinオプションを使用すると、コマンドは指定された文字(改行文字ではなく)を読み取りますread。このコマンドのkshオプションを使用すると、-A文字列変数の代わりにインデックス配列を読み取ることができます。を使用すると、-A変数の値がIFS入力の配列要素を分割するために使用されます。

テスト:

$ cat file
FILETYPE=A:B:C:D
$ { read -rd=; IFS=: read -rA filetypes; } <file
$ printf '"%s"\n' "${filetypes[@]}"
"A"
"B"
"C"
"D"

-Aに変更すると、-aコードがbash


ファイルに読みたくない追加の行が含まれている場合は、ksh93次のようにします。

grep '^FILETYPE=' file | { read -rd=; IFS=: read -rA filetypes; }

シェルオプションが設定されていて、コードがジョブ制御が無効になっている(そして上記のように変更された)非対話型シェル(スクリプトなど)で実行されていない限り、mkshNorでは機能しません。bashlastpipe-A-a

関連情報