次の内容を含むファイルがあります。
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 (またはzsh
ksh エミュレーションモード) を使用して次のことができます。
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
\K
A:B:C:D
tr
:
$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
またはksh93
:mksh
{ read -rd=; IFS=: read -rA filetypes; } <file
上記のコマンドは最初に入力の最初の文字を{...;}
読み込み、含めます。=
入力のこの部分はREPLY
変数に格納され、後でどの目的にも使用されません。その後、コードはそこから移動し、:
-で区切られた文字列を配列に読み込みますfiletypes
。
-d
inオプションを使用すると、コマンドは指定された文字(改行文字ではなく)を読み取ります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; }
シェルオプションが設定されていて、コードがジョブ制御が無効になっている(そして上記のように変更された)非対話型シェル(スクリプトなど)で実行されていない限り、mksh
Norでは機能しません。bash
lastpipe
-A
-a