Text-Processing
如何在 sed 內的 bash 執行中保留雙引號
我有一個包含很多這樣的行的日誌文件:
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'