如何使用 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
假设我有一个名为 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