当前位置: 首页 > 知识库问答 >
问题:

如何使用sed一次提取令牌之间的多个模式?

周滨海
2023-03-14

让我们假设我有一个名为inputFile的文件,看起来像这样:

blahblah token substring token something else token substring2 token

整个文件只包含一条长线。

我想用sed(substring,substring2)提取令牌之间的子字符串。

现在我有:

[sed "s/^.* \?token\(.* \)token.* \?/\1/"][1] inputFile > outputFile

我试图根据这些问题来做这件事,但不幸的是,它只返回最后一个子字符串

使用bash提取文本文件中两个标记之间的行

如何替换多个模式一次与se?

如何在两个图案之间选择线条?

有解释的答案会很好。

更新实际输入代码:

<archive><message id="0"><receiver>apr</receiver><sender>gtr</sender><text>52333</text><sendTime>554</sendTime><deliveryTime>765</deliveryTime></message><message id="0"><receiver>apr</receiver><sender>gtr</sender><text>4332</text><sendTime>764</sendTime><deliveryTime>922</deliveryTime></message></archive>

预期产出:

apr gtr 52333
apr gtr 4332

共有1个答案

危文乐
2023-03-14

问题在于sed是贪婪的,因此如果添加全局标志(g),上述命令将仅返回substring2

您可以使用awk将字段分隔符FS重新定义为字符串token。这样,字符串位于偶数字段位置:

$ echo "blahblah token substring token something else token substring2 token"  | \
  awk -F 'token' '{for(i=2;i<=NF;i+=2) {print $i}}'
 substring 
 substring2

更新:

如果您的输入是xml文件,您可能需要执行以下操作:

<archive>
   <message id="0">
       <receiver>apr</receiver>
       <sender>gtr</sender>
       <text>52333</text>
       <sendTime>554</sendTime>
       <deliveryTime>765</deliveryTime>
   </message>
   <message id="0">
       <receiver>apr</receiver>
       <sender>gtr</sender>
       <text>4332</text>
       <sendTime>764</sendTime>
       <deliveryTime>922</deliveryTime>
   </message>
 </archive>" 

导致cmd:

xmlstarlet sel -t -m '//message' -v receiver -o " " -v sender -o " " -v text -n <file>

哪个输出

apr gtr 52333
apr gtr 4332
 类似资料:
  • 问题内容: 我想在两种模式之间添加一些大代码: File1.txt infile.txt 我想在 第一 和 第二 之间添加 File1.txt 内容: 所需输出: 我可以使用sed命令使用两种模式进行搜索,但是我不知道如何在它们之间添加内容。 问题答案: 由于代表 读取文件 ,请使用: 您可以在此处找到一些信息:使用’r’命令读取文件。 为就地版本添加(即)。 要执行此操作,无论字符大小写如何,均

  • 问题内容: 我有一个包含以下行的文件: 我想在此文件上执行命令以仅提取参数名称,如以下输出所示: 这个命令可能是什么? 问题答案: 你要。 这将是一个快速而肮脏的hack:

  • 我不熟悉词法分析,如果标题不够清晰,我很抱歉。 基本上,我使用Jison来解析一些文本,并试图让lexer理解缩进。这里有一点值得商榷: 到目前为止,几乎所有这些都像预期的那样工作。一个问题是我试图返回一个令牌数组的行。看来Jison只是将该数组转换成一个字符串,这导致我得到一个解析错误,如。 我希望我能做的是手动将一些令牌推到堆栈上。也许有一个像或类似的东西。但是Jison的文档不是很好,我需要

  • 主要内容:GCC编译多文件项目通过前面几节的学习,读者已经了解了如何使用 gcc(g++)指令调用 GCC 编译器编译(包括预处理、编译、汇编和链接)C 或者 C++ 源代码,例如: [root@bogon demo]# ls demo1.c  demo2.c [root@bogon demo]# cat demo1.c #include<stdio.h> int main(){     printf("GCC:https:/

  • 问题内容: 我有一个千兆字节的JSON文件。该文件由每个不超过几千个字符的JSON对象组成,但是记录之间没有换行符。 使用Python 3和模块,如何一次将一个JSON对象从文件读入内存? 数据在纯文本文件中。这是类似记录的示例。实际记录包含许多嵌套的字典和列表。 以可读格式记录: 实际格式。新记录一个接一个地开始,没有任何中断。 问题答案: 一般而言,将多个JSON对象放入一个文件会使该文件 无

  • 我正在从事一个需要oauth2令牌才能进行通信的项目。后端给了我一个curl命令,但我不知道如何在Unity中将其转换为WWW格式,因为我以前没有使用http或json文件的经验。你能帮我取一下代币吗?谢谢下面是curl代码的样子: $curl-v-u{CLIENT_ID}:{CLIENT_SECRET}”https://api.domo.com/oauth/token?grant_type=cl