Shell:检查行格式文件并循环遍历文件行

Shell:检查行格式文件并循环遍历文件行

我需要检查 2 项资产:

  1. 文件内容格式
  2. 迭代该内容:

因此,内容文件必须是:

key1=value
key2=value2
...

因此,每一行必须具有格式key=value。之前或之后不允许有空格=。该文件内容必须是 env 格式文件。

另一方面,我需要将每一行分成循环内的akey和 a 。value

有任何想法吗?

答案1

使用bash:

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

验证分三个步骤完成;如果不满足这些条件中的任何一个,则会抛出错误,并且在第一个示例中,执行将中止并显示错误状态退出代码:

  • $1- 确保有(用输入规范的说法)一个“密钥”
  • $2- 确保有(用输入规范的说法)一个“值”
  • NF==2- 确保只有两个字段;前面提到的“键”和“值”

相关内容