首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除匹配模式前后的行

如何删除匹配模式前后的行
EN

Stack Overflow用户
提问于 2020-12-01 23:52:23
回答 3查看 212关注 0票数 1

我有一份像下面这样的文件。我希望将模式ABC_DATA作为变量进行搜索,匹配之后,我希望从前面的“多路径”行删除到包含"}“字符的行。"}“可以在ABC_DATA之后或在同一行中。

样本输出

代码语言:javascript
复制
multipaths {
multipath {
wwid 360000970000267600432533030353944
alias ABC_DATA_11
}
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353946
alias ABC_DATA_12 }

multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}

预期产出

代码语言:javascript
复制
multipaths {
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-12-02 00:29:38

代码语言:javascript
复制
$ awk -v RS='multipath\\s*{[^}]*ABC_DATA[^}]*}\\s*(\n|$)' -v ORS= '1' file
multipaths {
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}
票数 3
EN

Stack Overflow用户

发布于 2020-12-02 01:09:16

考虑到您的示例,您可以使用此perl

代码语言:javascript
复制
$ perl -0777 -lpe 's/\bmultipath\h+\{[^{}]*ABC_DATA[^{}]*}\s*//g' file
multipaths {
multipath {
wwid 360000970000267600432533030353945
alias DEF_DATA_11
}
multipath {
wwid 360000970000267600432533030353943
alias DEF_DATA_10
}
}
票数 0
EN

Stack Overflow用户

发布于 2020-12-02 14:59:04

使用sed,不太容易读,但绝对有可能:

代码语言:javascript
复制
sed '
   /^multipath {/ {
     :l
     /alias ABC_DATA/ {
       :f
       /}/ d
       N
       b f
     }
     /}/ b
     N
     b l
  }' input

或者作为单行:

代码语言:javascript
复制
sed '/^multipath {/{:l; /alias ABC_DATA/{:f /}/d;N;bf};/}/b;N;bl};' input
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65100288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档