简体   繁体   English

使用 bash 中的 sed 或 awk 修改文件中两个匹配字符串之间的行

[英]Modify lines in a file between two matching strings using sed or awk in bash

In bash how do I modify lines in yaml between two matching strings using awk or sed?在 bash 中,如何使用 awk 或 Z1775Z44AA797AF6F3E22 在两个匹配字符串之间修改 yaml 中的行

Like say I want lines between bbb and ddd modified,比如说我想修改 bbb 和 ddd 之间的行,

aaa:
  bbb:
  - c1
  - c2
  - c3
  ddd: 111

should become,应该变成,

aaa:
  bbb: ["c1","c2","c3"]
  ddd: 111

Something like就像是

sed -e '/bbb:/,/ddd:/c\  bbb: ["c1","c2","c3"]\n  ddd: 111' myfile

Disclaimer: Regex is not suitable for scalable structured data solutions.免责声明:Regex 不适用于可扩展的结构化数据解决方案。 Please use a dedicated YAML parser if at all possible.如果可能,请使用专用的 YAML 解析器

awk -v key=bbb '
    NF == 1 && $1 == key ":" {flag=$0; next}
    flag != "" {
        if(sub(/^[\t ]*- /, "")) {
            array[NR] = $0; next
        } else {
            for(i in array) out = out "," "\"" array[i] "\""
            print flag, "[" substr(out,2) "]"
            split("", array) # POSIX delete array
            flag=out="" # POSIX delete variables
        }
    } {print}
'

this is an extremely specific, brittle solution and should by no means ever be applied to general YAML parsing这是一个非常具体、脆弱的解决方案,绝不能应用于一般的 YAML 解析

This might work for you (GNU sed):这可能对您有用(GNU sed):

sed -E '/^\s*bbb:/{:a;N;/^\s*ddd:/M!ba;s/^\s*-\s*//mg;s/\n/","/g;s/",(.*),"/ [\1]\n/}' file

Gather up lines between bbb: and ddd: .收集bbb:ddd:之间的行。

Remove extra spaces and - characters at the beginnings or lines.删除开头或行中多余的空格和-字符。

Replace newlines by "," .","替换换行符。

Replace first ", by [ and last ," by ]\n .将第一个",替换为[和最后一个,"替换为]\n

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM