我有这样的字符串并尝试提取两个字符串之间的文本。
例子:
[{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
因此,做你想做的事情的最佳选择是使用拘萨罗南达的回答