Bash在两个带有特殊字符的字符串之间获取文本

问题描述:

我正在为Domoticz编写一个脚本,它可以通过gamertag查询读取我的Xbox One。但我需要从一些特殊字符中提取。无法找到任何解决方案,我可以使用,GREP,TR,AWK,SED等。最好是一行代码。Bash在两个带有特殊字符的字符串之间获取文本

这是字符串:

{"type":"XboxOne","titles":[{"id":714681658,"name":"Home","placement":"Background","state":"Active","lastModified":"2017-08-26T19:56:33.9199136Z"},{"id":252034287,"activity":{"richPresence":"In Main Menu"},"name":"The Elder Scrolls V: Skyrim Special Edition","placement":"Background","state":"Active","lastModified":"2017-08-26T19:56:33.9199136Z"},{"id":1693425033,"name":"Spotify Music - for Test","placement":"Full","state":"Active","lastModified":"2017-08-26T19:56:33.9199136Z"}]},{"type":"WindowsOneCore","titles":[{"id":328178078,"name":"Xbox App","placement":"Full","state":"Active","lastModified":"2017-08-26T19:53:40.7273986Z"}]}]} 

这是一个行代码,我只会从{“类型”:“XboxOne直到}需要。]},所以我只有我的控制台信息,但这些有特殊字符,我在寻找高和低,但找不到任何解决办法。

这是字符串我最终会。

{"type":"XboxOne","titles":[{"id":714681658,"name":"Home","placement":"Background","state":"Active","lastModified":"2017-08-26T19:56:33.9199136Z"},{"id":252034287,"activity":{"richPresence":"In Main Menu"},"name":"The Elder Scrolls V: Skyrim Special Edition","placement":"Background","state":"Active","lastModified":"2017-08-26T19:56:33.9199136Z"},{"id":1693425033,"name":"Spotify Music - for Test","placement":"Full","state":"Active","lastModified":"2017-08-26T19:56:33.9199136Z"}]}, 

任何帮助将不胜感激!

感谢,

+2

我不确定你到底想要什么。输入和输出字符串看起来是一样的 –

+1

,它们都是一英里宽。你不能把这个归结为10个字符的数据和2个字符的“特殊字符”? (或者至少是不需要滚动的东西?)。这看起来像json数据。有工具可用于处理它。 (不是专家,其他人可能会提供帮助)。祝你好运。 – shellter

+0

@minhtuannguyen第二个字符串是第一个字符串的子字符串。 –

一个衬垫

cat filename | grep -oP '\{"type":"XboxOne".*?(?=,{"type")' 

简要说明:
(?=,{"type"):一旦模式,{"type"发现
.*?停止匹配:做懒匹配和捕捉一切,直到第一个匹配,{"type"(对于情况下,如果你在json中有多个对象)

+1

在所有有用的帖子中,我一直在寻找这个帖子。谢谢!!! – cl3tus

它可以与GAWK这样的脚本来完成:

script.awk

BEGIN { RS="}]}"; 
     tgt="{\"type\":\"XboxOne" 
     } 

     { p=index($0, tgt); 
     if(p) printf("%s%s\n\n", substr($0, p), RS) 
     } 

使用方法如下:awk -f script.awk yourfile

说明 这个想法是使用静态字符串ins tead正则表达式以尽量减少特殊字符的溢出。这是这样完成的:

  • RS记录分隔符被设置为恒定串}]}每个记录在这样的刺结束,而不是在行结束
  • tgt也用作参数的index常量字符串功能,我们只需要逃避双引号

如果找到tgt(即p>0),我们从打印的p子录制结束(这是文达,但不包括}]}),我们另外打印出RS

您可以将脚本放入单行参数awk(我已添加必要的;),但为了清晰起见,我将其放入多行脚本中。

这是一个sed解决方案,

sed 's/,{"type".*$/,/g' file 

该命令将替换匹配正则表达式,"type".*$的字符串到,,它们也符合您的请求。