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

How to extract multiple patterns between tokens at once with sed?

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

blahblah token substring token something else token substring2 token

整个文件只包含 1 长行。

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

此刻我有:

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

我尝试根据这些问题来做这个,但不幸的是 returns 只有最后一个子字符串

Extract lines between 2 tokens in a text file using bash

How to replace multiple patterns at once with sed?

有解释的答案会很棒。

更新 真实输入码:

<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

问题是 sed 是贪婪的所以上面的命令只会 return substring2 如果你添加全局标志 (g) :

您可以为此使用 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>" 

导致命令:

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

输出

apr gtr 52333
apr gtr 4332