bash - 提取两个模式之间的行并使用 if 条件删除行之间的行
问题描述
我有一个包含以下内容的文件。我正在尝试提取具有匹配开始和结束模式的块,在这两者之间我想排除具有不匹配数字 id(可能是模式)的块。这里必须排除 [001] 以外的内容。002 可能不为人知。所以,我希望块只与 [001] 匹配。
文件包含,
text [001] start
line 1
line 2
text [002] mid start
line 3
line 4
text [002] mid end
line 5
line 6
text [001] end
我需要该块,不包括不匹配的数字 id [002] 的块。
text [001] start
line 1
line 2
line 5
line 6
text [001] end
对于这个问题,我无法在互联网上得到明确的澄清。任何人都可以帮助解决这个问题,awk 或 sed 解决方案吗?
为了获得具有开始和结束模式的块,我正在尝试
awk '/[001]/ && /start/, /001/ && /end/' File
解决方案
假设您的块嵌套到任何深度并且从不重叠:
$ cat tst.awk
BEGIN { tgtId="001" }
match($0,/\[[0-9]+\]/) {
id = substr($0,RSTART+1,RLENGTH-2)
state = $NF
}
state == "start" { isTgtBlock[++depth] = (id == tgtId ? 1 : 0) }
isTgtBlock[depth] { print }
state == "end" { --depth }
{ id = state = "" }
$ awk -f tst.awk file
text [001] start
line 1
line 2
line 5
line 6
text [001] end
推荐阅读
- list - Variable in a list datastep SAS
- r - 如何将日期/时间对象转换为小数?
- css - 图像和边框之间的奇怪边距
- typescript - Promise.race 的返回类型应该是什么?(打字稿)
- kotlin - 如何为自定义对象的 ArrayList 添加 parcelable 实现?
- r - 编码数学表达式
- r - 在 R httr、jsonlite、dplyr 中抓取推文
- reactjs - 反应为什么'clearTimeout'不适用于useeffect返回回调
- python - 在pocketsphinx连续更改语言和字典,LiveSpeech到法语,我得到了new_Decoder返回-1异常
- java - java中意外关闭的扫描仪,现在收到IllegalStateException