使用 shell(bash)-脚本从文件中导出带有子字符串的字符串

export string with substring from file with shell(bash)-script

我有文件 variables.tf:

variable "do_token" {
  description = "set DO token value"
  type        = string
}

variable "ssh_pub_key_fingerprint" {
  description = "Set ssh key fingerprint stored in DO"
  type        = string
}

...

并且我想编写用于导出变量名称的脚本,其中包含评论等描述,以归档 terraform.tfvars。但是第一行必须是#description,第二行带空值和双引号的变量,像这样:

cat terraform.tfvars

#set DO token value
do_token = ""

#Set ssh key fingerprint stored in DO
ssh_pub_key_fingerprint = ""

我试着写 bash 脚本 test.sh 像这样:

#!/bin/bash
echo -n "" > test.txt
grep 'description\|variable' variables.tf | while read line; do 
    OUTPUT=$(echo $line | sed 's/ =//g; s/ {//g' );
    # echo $OUTPUT
case "$OUTPUT" in 

  *description*)
    DESCRIPTION=$(echo $OUTPUT | awk -F "\"" '{print }')
    echo "#"$DESCRIPTION >> terraform.tfvars
    ;;

  *variable*)
    VARIABLE=$(echo $OUTPUT | awk -F "\"" '{print }')
    echo $VARIABLE " = \"\"">> terraform.tfvars
    ;;
esac    
done

但是当我显示文件时 terraform.tfvars 值行是第一行,描述行是第二行 但必须相反

do_token  = ""
#set DO token value 

ssh_pub_key_fingerprint  = ""
#Set ssh key fingerprint stored in DO

我怎样才能正确地做到这一点?谢谢

整个程序最好用 awk 本身实现。鉴于您的意见,

#!/bin/bash
gawk '
  BEGIN { first = 1 }
  /variable/ {
    curr_var = gensub(/"/, "", "g", )
  }
  /description = ".*"/ {
    if (first != 1) { printf("\n") }
    printf("%s = \"\"\n", curr_var)
    printf("#%s\n", gensub(/.*["]([^"]+)["].*/, "\1", [=10=]))
    first=0
  }
'

...作为输出发出:

do_token = ""
#set DO token value

ssh_pub_key_fingerprint = ""
#Set ssh key fingerprint stored in DO

https://ideone.com/S8Fmz1

的在线沙箱中查看此内容

如果sed是一个选项

$ sed -n '/do_token/ {N;s/variable "\([^"]*\).*\n  description = "\([^"]*\).*/#\n = ""\n/p};/ssh/{N;s/variable "\([^"]*\).*\n  description = "\([^"]*\).*/#\n = ""/p}' input_file > terraform.tfvars
$ cat terraform.tfvars
#set DO token value
do_token = ""

#Set ssh key fingerprint stored in DO
ssh_pub_key_fingerprint = ""