仅使用queueFilters部分下的数据更新特定行

时间:2017-05-25 09:42:48

标签: linux shell

我的文件和内容如下所示。

------------------------------------------------

##
servers:
# Start OF VM1
 - host: "VM1"
   queueFilters: 
       include: ["*"]
   channelFilters: 
       include: ["*"]
# End OF VM1

# Start OF VM2
- host: "VM2"
   queueFilters: 
       include: ["*"]
   channelFilters: 
       include: ["*"]
# End OF VM2
---------------------------------------------------

我想更新像queueFilter部分中的include之类的参数:["test1","test2","test3"]仅限于从# Start OF VM1到#End OF VM1

的行之间

我尝试使用命令

V1=VM1
V2="test1","test2","test3"

awk -F': ' '/# Start OF '$V1'/,/# End OF '$V1'/{if( $0 ~/include/ ) {if ( $2 ~ /\[\]/ ) {gsub(/\]/,"'$V2']")} else {gsub(/\]/,",'$V2']")}}}1' input.yaml

有人可以帮我解决这个问题吗。

1 个答案:

答案 0 :(得分:0)

首先,您应该将shell变量分配给awk变量,而不是尝试将shell变量替换为脚本。

其次,如果您只想更新queueFilters,则需要与之匹配。您可以设置一个变量,当您到达include行时将使用该变量。

V1=VM1
V2='"test1","test2","test3"'

awk -F': ' -v V2="$V2" '
    /# Start OF '$V1'/,/# End OF '$V1'/ {
        if (/queueFilters:/) {inqueue = 1}
        else if ($1 ~ /include/ && inqueue) {
             if ( $2 ~ /\[\]/ ) {
                gsub(/\]/, V2 "]")
             } else {
                gsub(/\]/, "," V2 "]")
             }
             inqueue = 0
        }
    }1' input.yaml