【问题标题】:Convert string in Shell在 Shell 中转换字符串
【发布时间】:2021-10-25 08:44:31
【问题描述】:

我有以下变量:

tags = {
    environment  = "development",
    provider     = "ServiceOne",
    ansible_role = "nfs-role",
    comment      = "mysql"
}

在我的管道中,我需要将其转换为以下内容:

tfh pushvars -overwrite-all -dry-run false -hcl-var "tags={environment=\"development\", provider=\"ServiceOne\", ansible_role=\"nfs-rolep\",comment= \"mysql\"}"

我尝试了 SEDAWK,但没有得到任何结果?

这就是我现在站的地方:

#!/bin/bash

#[[ -z "$2" ]] && echo "==> Usage: ./transform_tfe_vars.sh <<INPUT_FILE>> <<OUTPUT_FILE>>" && exit 1;

vars_file=${1}
#output_file=${2}
tmp_file=".todelete.tmp"

cmd "$vars_file" | grep -v '^#' | awk '!/^$/' > "$tmp_file"


while read -r p; do

    a=$(echo "$p" | awk '{print $1}')
    b=$(echo "$p" | awk '{print $3}')
    echo "tfh pushvars -overwrite-all -dry-run false -shcl-var \"$a=\\""$b""\""

done <$tmp_file

【问题讨论】:

  • 是的,我已经添加了输入......它应该看起来像上面的样子
  • 你把它变成了一个不同的问题,你接受的我的回答并不完全适用。我把这个问题放回原样 - 如果您需要更多帮助,请提出一个新的后续问题。
  • 我创建了一个新问题:stackoverflow.com/questions/68923925/…

标签: shell awk sed


【解决方案1】:

shell 读取循环始终是处理文本的错误方法,请参阅why-is-using-a-shell-loop-to-process-text-considered-bad-practice。发明 shell 的人也发明了 awk 让 shell 调用来操作文本。

看起来这可能是你想要做的:

#!/usr/bin/env bash

(( $# == 2 )) || { echo "==> Usage: ${0##*/} <<INPUT_FILE>> <<OUTPUT_FILE>>"; exit 1; }

vars_file="$1"
output_file="$2"

awk '
    BEGIN {
        ORS = ""
        print "tfh pushvars -overwrite-all -dry-run false -hcl-var \""
    }
    NF && !/^#/ {
        gsub(/[[:space:]]/,"")
        gsub(/"/,"\\\\&")
        print
    }
    END {
        print "\"\n"
    }
' "$vars_file" > "$output_file"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多