Text-Processing
查找字元串並刪除兩個分隔符之間的所有內容
我已經搜尋過,我不知道我做錯了什麼,但我找不到這個問題的答案。
我有一個文件,所有文本都儲存為一行。我需要找到一個模式並刪除該文本之前和之後的所有文本,直到分隔符。
前任。文件
[{"something":false,"more":"123","moresamerecord":"otherstuff"},{"something":false,"more":"abc","moresamerecord":"otherstuff"},{"something2":false,"more":"def","moresamerecord":"otherstuff"},{"something2":false,"more":"456","moresamerecord":"otherstuff"}]
請記住,這是包含多條記錄的單行。我正在嘗試找到“abc”並刪除上一條和下一條記錄之間的所有內容。
預期的結果應該是這樣。
[{"something":false,"more":"123","moresamerecord":"otherstuff"},{"something2":false,"more":"def","moresamerecord":"otherstuff"},{"something2":false,"more":"456","moresamerecord":"otherstuff"}]
我一直在嘗試但無法解決這個問題,任何幫助將不勝感激。
如前所述,
jq
是用於此類數據的工具。但是,jq 確實施加了某些語法約束,例如“對象列表需要位於方括號表示的數組中”。如果您無法確保該文件已經是有效的 json,您可以使用 sed 對其進行預處理(我們將通過 jq 進行初始執行,因為結果更容易查看,同時還會檢查其正確性。 )
$ sed 's/^/[/; s/,$/]/' data.txt | jq -r '.[]' { "something": false, "more": "123", "moresamerecord": "otherstuff" } { "something": false, "more": "abc", "moresamerecord": "otherstuff" } { "something2": false, "more": "def", "moresamerecord": "otherstuff" } { "something2": false, "more": "456", "moresamerecord": "otherstuff" }
現在,讓我們修改 jq 命令以刪除任何匹配的對象
"more": "abc"
:$ sed 's/^/[/; s/,$/]/' data.txt | jq -r '.[] | select(.more != "abc")' { "something": false, "more": "123", "moresamerecord": "otherstuff" } { "something2": false, "more": "def", "moresamerecord": "otherstuff" } { "something2": false, "more": "456", "moresamerecord": "otherstuff" }
最後,您似乎還需要一個後處理步驟將其壓縮回一行,其中包含逗號分隔符且沒有空格:
$ sed 's/^/[/; s/,$/]/' data.txt | jq -r '.[] | select(.more != "abc")' | sed 's/}$/},/' | tr -d ' \n' {"something":false,"more":"123","moresamerecord":"otherstuff"},{"something2":false,"more":"def","moresamerecord":"otherstuff"},{"something2":false,"more":"456","moresamerecord":"otherstuff"},