こんにちは、kshスクリプトを使用して1行を配列に読み込もうとしています。ただし、フィールド値にカンマがある場合、その値の一部は隣接する配列要素に複数回格納されます。この状況を避ける方法は?
入力する
17~4~~~char~Y~\"[_a-zA-Z0-9\.]\+@[a-zA-Z0-9]\+\.[a-z]\{2,\}\"~40~email id
パスワード
while IFS= read -r line
do
if [ $n != 1 ]; then
IFS="~"
set -A star $line
col_pos=${star[1]}
col_patt=${star[6]}
col_len=${star[7]}
col_file_id=${star[0]}
$行の値
17 4 char Y \"[_a-zA-Z0-9\.]\+@[a-zA-Z0-9]\+\.[a-z]\2\" \"[_a-zA-Z0-9\.]\+@[a-zA-Z0-9]\+\.[a-z]\\\" 40 email id
問題は、読み込み時にパターン("[_a-zA-Z0-9.]+@[a-zA-Z0-9]+.[az]\2")が繰り返されるが、実際の入力ファイルではパターンフィールドは一度定義されます。
ベストアンサー1
存在する:
set -A star $line
引用されていないかのように$line
分割+グローブ演算子を呼び出しています。ここでは分割セクションが必要ですが、グローバルセクションは必要ないため、まず無効にする必要があります。
set -o noglob
@Isaacが正しく識別したように、ここでは問題はglobbingとは関係ありませんが、globbingに加えてksh(およびksh1のみ)によって中括弧拡張が実行されますが、globbingが無効になると無効になります。
set -A array x y z
配列を全体的に設定する ksh88/pdksh メソッドです。 kshの最新バージョン(ksh93とmkshを含む)はzshスタイルを採用していますarray=(x y z)
。
構文を使用するには、set -A
次のものが必要です。
set -A array -- values
(zshがkshをエミュレートしない限り)それ以外の場合、-
最初の値がまたはで始まると正しく機能しません+
。
だから:
set -o noglob; IFS='~'
while IFS= read -r line
do
if [ "$n" != 1 ]; then
set -A star -- $line
col_pos=${star[1]}
col_patt=${star[6]}
col_len=${star[7]}
col_file_id=${star[0]}
しかし、ここではこれらの問題をすべて回避し、次の標準sh
構文を使用します。
while IFS='~' read -r col_file_id col_pos x x x x col_patt col_len x
do
if [ "$n" != 1 ]; then
¹ mksh および一部の最新バージョンの ksh93 で POSIX モードが有効になっていない場合、またはコンパイル時に中括弧拡張が完全に無効になっていない限り