Shell: 行形式ファイルを確認し、ファイル行を繰り返します。

Shell: 行形式ファイルを確認し、ファイル行を繰り返します。

2つのアセットを確認する必要があります。

  1. ファイルコンテンツ形式
  2. このコンテンツを繰り返します。

したがって、コンテンツファイルは次のようになります。

key1=value
key2=value2
...

したがって、各行には型が必要ですkey=value。前後にスペースを入れることはできません=。このファイルの内容はenv形式のファイルでなければなりません。

一方、ループ内で各行をaとaに分割する必要がありますkeyvalue

どんなアイデアがありますか?

答え1

バッシュ使用:

n=0
while IFS="=" read -r key value; do
    ((n++))
    if [[ -z $key ]]; then echo "missing key on line $n"; continue; fi
    if [[ -z $value ]]; then echo "empty value on line $n"; continue; fi
    echo "key:>$key<; value:>$value<"
done <<END
key1=value1
key2=value2
key3=
=value3
foo

key4=value4=value5=value6
END

出力

key:>key1<; value:>value1<
key:>key2<; value:>value2<
empty value on line 3
missing key on line 4
empty value on line 5
missing key on line 6
key:>key4<; value:>value4=value5=value6<

答え2

このファイルを次のように指定しますinput

key1=value1
key2=value2
key3=
=value3
key4=value4

=フィールド区切り文字として使用できますawk

$ awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR; exit 1} { print $1, $2 }' input
key1 value1
key2 value2
File failed validation on line 3

標準エラーに検証エラーメッセージを表示するにはprintステートメントを修正し、エラーが表示された後に処理を続行するには、ステートメントを次exitのように変更しますnext

$ awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' input
[stdout] key1 value1
[stdout] key2 value2
[stdout] key4 value4
[stderr] File failed validation on line 3
[stderr] File failed validation on line 4

検証は3つのステップで行われます。これらの条件のいずれかが満たされない場合はエラーが発生し、最初の例ではエラー状態終了コードで実行が中断されます。

  • $1- (入力仕様の用語で)「キー」があることを確認してください。
  • $2- (入力仕様の用語で)「値」があることを確認してください。
  • NF==2- 前述の「キー」と「値」フィールドが2つしかないことを確認してください。

関連情報