从文本文件中的键和值中提取字符串,然后分配给新变量

从文本文件中的键和值中提取字符串,然后分配给新变量

需要一个脚本来迭代下面的文件来读取键、值并提取值,例如。 foo_key1、foo.com、/tmp/worker${Build_Number} 将键和值分配给另一个变量(例如 A="foo_key1"、B="foo.com"、C="/tmp/worker${构建_编号}”)。

cat abc.txt

foo_key1=foo.com|/tmp/worker${Build_Number}
foo_key2=goo.com|/tmp/manager${Build_Number}

我已经尝试过下面的代码,但没有运气。

while IFS== read -r key val ; do
    val=${val%\"}; val=${val#\"}; key=${key#export };
    A="$(cut -d'_' -f1 <<<"$key")"
    B="$(cut -d'_' -f1 <<<"$val")"
    C="$(cut -d'_' -f2 <<<"$val")"
    echo $A
    echo $B
    echo $C
  done < abc.txt

预期输出:

foo_key1 
foo.com
/tmp/worker${Build_Number}

答案1

只需使用 awk 进行分割=|打印 3 列,然后使用read将列分配给变量

awk -F '[=|]' '{print $1, $2, $3}' abc.txt | while read A B C; do
    echo $A
    echo $B
    echo $C
done

您还可以在大括号前添加正则表达式来过滤数据,例如,'/\S+/ {print $1, $2, $3}'这使用正则表达式来匹配超过 1 个非空格字符,从而跳过空白行

答案2

你可以试试 :

while IFS='|=' read A B C ; do
  echo "$A"
  echo "$B"
  echo "$C"
done < abc.txt

答案3

您的代码将从这些修订中受益:

#!/bin/bash

cat abc.txt | while IFS= read -r line ; do

A=$(echo $line | sed -e 's/=/ /g;s/|/ /g' |  awk '{print $1}')
B=$(echo $line | sed -e 's/=/ /g;s/|/ /g' |  awk '{print $2}')
C=$(echo $line | sed -e 's/=/ /g;s/|/ /g' |  awk '{print $3}')

    echo $A
    echo $B
    echo $C
  done

foo_key1
foo.com
/tmp/worker${Build_Number}
foo_key2
goo.com
/tmp/manager${Build_Number}

相关内容