如何提取两个字符串之间的文本

如何提取两个字符串之间的文本

我有这样的字符串并尝试提取两个字符串之间的文本。

例子:

[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]

我想提取b12和之间的唯一值,},{m12:并且我所需的输出是1

我尝试过sed但没有得到预期的输出。不确定是否是由于多次出现b12.任何意见将是有益的。

答案1

假设输入是有效的 JSON:

[{"a12":12},{"b12":1},{"m12":34},{"b12":2},{"k12":45}]

...我们可以用来jq提取具有键的顶级数组的第一个元素b12,然后从该元素中提取键的值:

jq 'map(select(has("b12"))) | first.b12' file

将键的名称作为命令行参数:

jq --arg k 'b12' 'map(select(has($k))) | first[$k]' file

答案2

使用您可以通过指定一个来sed提取1匹配组在你给定的字符串之间。顺便说一句,你说你想要b12和之间的字符串,},{m12:但在这种情况下的输出将是:1.所以你真正想要的是b12:和之间的文本},{m12:
所以代码应该是这样的:

echo '[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]' | sed  's/.*b12:\(.*\)},{m12:.*/\1/'

或者

sed  's/.*b12:\(.*\)},{m12:.*/\1/' <<< '[{a12:12},{b12:1},{m12:34},{b12:2},{k12:45}]'

该模式s/.*b12:\(.*\)},{m12:.*/\1/将取代b12:您之前拥有的所有内容(.*b12:)并且它也将取代},{m12:它之后的所有内容(},{m12:.*) 由匹配组。匹配\(.*\)组 (在你的情况下1)并且该模式\1代表这一点。

笔记
使用这个sed命令你可能有“问题”。例如,如果您有更多m12类似的内容:

'[{a12:12},{b12:1},{m12:34},{b12:2},{m12:45}]'
'[{a12:12},{b12:1},{m12:34},{b12:2},{m12:10},{m12:45}]' 

输出将(分别):

2
2},{m12:10

因此,做你想做的事情的最佳选择是使用拘萨罗南达的回答


你可以阅读能够理解如何匹配组工作。

相关内容