簡體   English   中英

使用 bash 中的 sed 或 awk 修改文件中兩個匹配字符串之間的行

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

在 bash 中,如何使用 awk 或 Z1775Z44AA797AF6F3E22 在兩個匹配字符串之間修改 yaml 中的行

比如說我想修改 bbb 和 ddd 之間的行,

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

應該變成,

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

就像是

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

免責聲明:Regex 不適用於可擴展的結構化數據解決方案。 如果可能,請使用專用的 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}
'

這是一個非常具體、脆弱的解決方案,絕不能應用於一般的 YAML 解析

這可能對您有用(GNU sed):

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

收集bbb:ddd:之間的行。

刪除開頭或行中多余的空格和-字符。

","替換換行符。

將第一個",替換為[和最后一個,"替換為]\n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM