[英]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
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.