使用 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
的在线沙箱中查看此内容
如果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 = ""
我有文件 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
的在线沙箱中查看此内容
如果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 = ""