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



我有文件变量。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.tfwars。但第一行必须是#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 $2}')
echo "#"$DESCRIPTION >> terraform.tfvars
;;
*variable*)
VARIABLE=$(echo $OUTPUT | awk -F """ '{print $2}')
echo $VARIABLE " = """>> terraform.tfvars
;;
esac    
done

但当我显示文件地形时。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", $2)
}
/description = ".*"/ {
if (first != 1) { printf("n") }
printf("%s = ""n", curr_var)
printf("#%sn", gensub(/.*["]([^"]+)["].*/, "\1", $0))
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 = "([^"]*).*/#2n1 = ""n/p};/ssh/{N;s/variable "([^"]*).*n  description = "([^"]*).*/#2n1 = ""/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 = ""

最新更新