Text-Processing

如何在 sed 內的 bash 執行中保留雙引號

  • September 9, 2021

我有一個包含很多這樣的行的日誌文件:

2021/09/03-13:11:05;QUEUE.INBOUND;4;ID:myhost.mydomain.net-7756-1629822315072-199:973:1:1:1;MISC;"<?xml version="1.0" encoding="UTF-8"?> <RootElement xmlns="urn:namespace:entity/1" tstamp="2021-02-29T12:11:00Z" object="urn:domain:entity:ID1234"><Active lang="en" value="true">active</Active><Name lang="en">Some Name</Name><ShortName lang="en">shortname</ShortName><Phone number="+416458838829" lang="en">+416458838829</Phone><Email>info@somewhere.com</Email><Longitude>7.043786</Longitude><Latitude>47.239036</Latitude></RootElement>"

(XML 比這個大,但這只是一個例子。)

我的目標是將每一行中的每個 XML 提取到一個專用文件中。如果日誌包含 10 行,則將創建 10 個文件。

我從這個開始:

more mylogfile.txt | sed -r 's!^.*\s(<RootElement.*\sobject="urn:domain:entity:([A-z0-9]*)"><Active.*</RootElement>).*!echo "\1" | xmlstarlet fo > "\2.xml"!e; d'

這個想法是提取對象 urn 中的 ID 並將其用作文件名(id 在文件中是唯一的)。

問題:

單獨執行“echo”命令時

more mylogfile.txt | sed -r 's!^.*\s(<RootElement.*\sobject="urn:domain:entity:([A-z0-9]*)"><Active.*</RootElement>).*!echo "\1"!e; d'

我注意到 XML 中的雙引號剛剛被擦除,並且xmlstarlet命令(在第一次嘗試中)只會出錯。

Active 元素的範例將變為:

<Active lang=en value=true>active</Active>

sed我知道在and中執行 bash 命令時語法有一些技巧echo,但我嘗試了幾種不同的語法(比如刪除 \1 周圍的“”,使用printf,使用xargs外部sed代替,等等……)但它們都沒有成功.

我正在使用 Ubuntu 發行版 18.04(Windows 下的 WSL 1)。

echo或“ ”命令中是否有任何選項sed s!...!...!e可以改善這一點?

(如果你找到更有效的方法,我也開放)

您需要先用 . 轉義引號s/"/\\"/g。這樣可以防止它們被吃掉echo

然後記得調整你的搜尋模式。您需要匹配\"而不是",並且反斜杠需要轉義,因此它需要\\"在搜尋模式中:

sed -E 's/"/\\"/g;s!^.*\s(<RootElement.*\sobject=\\"urn:domain:entity:([A-Za-z0-9]*)\\"><Active.*</RootElement>).*!echo "\1"!e;d'

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