Text-Processing

查找字元串並刪除兩個分隔符之間的所有內容

  • February 8, 2021

我已經搜尋過,我不知道我做錯了什麼,但我找不到這個問題的答案。

我有一個文件,所有文本都儲存為一行。我需要找到一個模式並刪除該文本之前和之後的所有文本,直到分隔符。

前任。文件

[{"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"},

引用自:https://unix.stackexchange.com/questions/633229