[英]How do I separate xmlstarlet output with nul?
我正在嘗試使用 nul (U+0) 來分隔 xmlstarlet 輸出中的 xml 值。 xmlstarlet
忽略-o ''
、 -o $'\\0'
和-o '\\0'
。
我知道我可以使用其他字符(如各種字段分隔符)來分隔輸出。 這種方法的問題在於這些字符也可以作為數據存在。 我不想有任何歧義。
我想特別使用 nul,因為它是唯一不能用原始 XML 表示的值。
所以,重復我的問題:如何將 xmlstarlet 輸出與 nul 分開?
應請求者的要求,我已包含以下信息。 雖然我很感激您提供幫助的願望,但請避免建議XY 解決方案。 我只是在尋找我提出的問題的答案。
我正在處理的數據如下所示:
<data>
<datapoint attribute-1="val-1" attribute-2="val-a" />
<datapoint attribute-1="val-2" attribute-2="val-b" />
<datapoint attribute-1="val-3">
<sub-datapoint />
</datapoint>
</data>
我嘗試使用 xmlstarlet 的方式:
mapfile -tf ARRAY < <( xmlstarlet sel -t -m /data/datapoint -o 'datapoint' -o $'\0' -v ./@attribute-1 -o $'\0' data.xml )
我正在尋找的輸出的十六進制轉儲:
64 61 74 61 70 6f 69 6e 74 00 76 61 6c 2d 31 00 |datapoint.val-1.|
64 61 74 61 70 6f 69 6e 74 00 76 61 6c 2d 32 00 |datapoint.val-2.|
64 61 74 61 70 6f 69 6e 74 00 76 61 6c 2d 33 00 |datapoint.val-3.|
不幸的是, xmlstarlet
似乎無法在其輸出中生成 nul。
然而xmlstarlet
能夠產生U+FFFF
; 在所有 XML 版本中都無效的代碼點。 您可以使用此代碼安全地分隔 XML 值,然后使用另一個程序將其替換為 nul:
xmlstarlet sel -t \
-m /data/datapoint \
-o 'datapoint' \
-o $'\uffff' \
-v ./@attribute-1 \
-o $'\uffff' data.xml \
| python3 -c 'import sys;
sys.stdout.write(sys.stdin.read().replace("\uffff", "\0"))'
您可以使用$'\\1'
在大多數情況下應該與 null 一樣好:
mapfile -d $'\1' -t ARRAY < <( xmlstarlet sel -t -m "XPATH" -v "XPATH" -o $'\1' -v 'XPATH' "FILE" )
這是@TendersMcChiken 答案的變體,用 perl 代替了 python:
xmlstarlet sel -t -m /data/datapoint \
-o 'datapoint' -o $'\uffff' -v ./@attribute-1 -o $'\uffff' data.xml \
| perl -C -0xFFFF -l0 -pe '' \
| hexdump -e '16/1 "%-3.2x"' -e '"|" 16/1 "%_p" "|\n"'
結果與問題中顯示的 hexdump 輸出匹配。
順便說一句,既然目標是結果捕捉到一個bash數組,我不知道為什么這次沒工作:
mapfile -d $'\uffff' -t arr < <(
xmlstarlet sel -t -m /data/datapoint \
-o 'datapoint' -o $'\uffff' -v ./@attribute-1 -o $'\uffff' data.xml
)
這不起作用的原因是 bash 當前不支持多字節字符作為內置mapfile
的分隔符。 [ 來源]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.