2017-08-27 72 views
-1

我正在爲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第二個字符串是第一個字符串的子字符串。 –

回答

3

一個襯墊

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

簡要說明:
(?=,{"type"):一旦模式,{"type"發現
.*?停止匹配:做懶匹配和捕捉一切,直到第一個匹配,{"type"(對於情況下,如果你在json中有多個對象)

+1

在所有有用的帖子中,我一直在尋找這個帖子。謝謝!!! – cl3tus

1

它可以與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(我已添加必要的;),但爲了清晰起見,我將其放入多行腳本中。

0

這是一個sed解決方案,

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

該命令將替換匹配正則表達式,"type".*$的字符串到,,它們也符合您的請求。

相關問題