
こんにちは、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 モードが有効になっていない場合、またはコンパイル時に中括弧拡張が完全に無効になっていない限り
答え2
質問:
- スクリプトが不完全です(完了不足、fi不足など)。
- 変数は引用符で囲む必要があります(デフォルトでは常に)。
ただし、主な問題は、括弧式の{2,}
前と末尾、2
およびnothing
拡張時に文字列を繰り返す中括弧式にありますset -A star $line
。
一つ引用しない $line
いくつかの拡張があり、そのうちの1つは中括弧拡張です{,}
。
引用符なしで文字列を拡張せずに分割するには、~
区切り文字として使用し、値を配列に入れると、次のように動作します。
while IFS= read -r onestar; do star+=("$onestar"); done <<<"${line//~/$'\n'}"
line
改行なしで1行しかないと仮定すると、そうしないでください。