首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择重复的两个文本模式之间的所有文本或字符。

选择重复的两个文本模式之间的所有文本或字符。
EN

Unix & Linux用户
提问于 2023-03-23 07:42:51
回答 2查看 80关注 0票数 -2

下面是示例.log文件(这里可以有更多行)

代码语言:javascript
复制
2022 User abc (iii)
2023 defaa <party> ttt
2222221 User def (bbb)
20222 defaa <accoun> ttt
2222 User dddd (aaa)
3333 defaa <hahaha> jmd

我想在Userttt之间选择行

请注意,这些类似于日志的5-7行,这个日志中可以有更多由Userttt组成的行。

因此,我想知道一种获取Userttt之间所有行的方法,即使它们在文件中被重复

文本Userttt并不总是在连续的行上

预期产出:

代码语言:javascript
复制
abc (iii)
2023 defaa <party> 
def (bbb)
20222 defaa <accoun> 

在筑巢的情况下,如下所示:

代码语言:javascript
复制
2022 User abc (iii)
2222221 User def (bbb)
20222 defaa <accoun> ttt
2023 defaa <party> ttt

预期产出:

代码语言:javascript
复制
def (bbb)
20222 defaa <accoun>

User & ttt永远不会在同一条线上

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2023-03-23 10:29:10

使用sed,您可以选择一个地址范围fron Userttt,并在保持空间中收集:

代码语言:javascript
复制
sed '/User/,/ttt/!d;H;/User/h;/ttt/!d;x;s/.*User //;s/ttt.*//' yourfile

不合标准的解释:

  • /User/,/ttt/在从User到下一个ttt的范围内选择行(就像嵌套的情况所要求的那样);这个选择由!d选择。因此,此步骤移除此范围之外的所有行。不幸的是,从最后一个User到文件末尾的最后一个部分没有被删除,所以我们需要一种方法来消除这个问题:
  • H将所有行附加到保持空间,而/User/h则将带有User的行复制到保持空间,因此保持空间包含从User到当前行的所有行。这样,新的User行就会覆盖之前的所有内容,就像嵌套的情况所期望的那样。
  • /ttt/!d在没有ttt的情况下停止对所有行的执行,因此我们不会生成任何输出,直到我们在保存空间中收集了User' to‘t`中的所有内容。
  • 但是一旦我们把所有的东西都放在一起,我们就可以x改变缓冲区,让这些行从我们的模式空间中的保持空间中,
  • 然后使用User将所有内容删除到s/.*User //
  • 并从ttts/ttt.*//开始删除所有内容
票数 0
EN

Unix & Linux用户

发布于 2023-03-23 13:21:38

使用GNU来表示多个字符的RSRT\s[:space:]的缩写,您可能需要这样做:

代码语言:javascript
复制
$ awk -v RS='\\s*ttt' 'RT && sub(/.*User\s*/,"")' file
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>

如果不希望在Userttt上允许部分匹配,那么在它们周围添加单词边界:

代码语言:javascript
复制
awk -v RS='\\s*\\<ttt\\>' 'RT && sub(/.*\<User\>\s*/,"")' file
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/740690

复制
相关文章

相似问题

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