ksh SET - 配列読み取りの問題

ksh SET - 配列読み取りの問題

こんにちは、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 モードが有効になっていない場合、またはコンパイル時に中括弧拡張が完全に無効になっていない限り

おすすめ記事