Bash
如何在 Bash 腳本中提取部分 XML 標記值
我有一個這樣的 XML 文件(
A.xml
):<?xml version="1.0"?> <RunParameters xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <RunParametersVersion>NextSeq_4_0_0</RunParametersVersion> <ReagentKitSerialWasEnteredInBaseSpace>false</ReagentKitSerialWasEnteredInBaseSpace> <ExperimentName>210913-RUN61-COCO</ExperimentName> <PurgeConsumables>false</PurgeConsumables> <MaxCyclesSupportedByReagentKit>92</MaxCyclesSupportedByReagentKit> <ModuleName /> <ModuleVersion /> </RunParameters>
我想設置一個包含
RUN61
XML 標籤埠的bash 變數<ExperimentName>210913-RUN61-COCO</ExperimentName>
。標記值始終具有結構不*相關*- 相關 - 不相關
用破折號分隔。
我嘗試了
grep
但沒有任何好的結果:runNumber=$(grep -o '<ExperimentName>.*</ExperimentName>' | cut -d '-' -f2 A.xml)
你知道怎麼做嗎?
由於您正在處理結構化數據,因此您應該使用專用解析器,例如
xmlstarlet
提取標籤值以提供給cut
:xmlstarlet sel -t -c "string(/RunParameters/ExperimentName)" A.xml | cut -d- -f 2
所以,你可以使用
runNumber=$(xmlstarlet sel -t -c "string(/RunParameters/ExperimentName)" A.xml | cut -d- -f 2)
僅使用
xmlstarlet
:experiment_name=$( xmlstarlet sel -t \ -m '/RunParameters/ExperimentName' \ -v 'substring-before(substring-after(., "-"), "-")' file.xml )
這匹配我們感興趣的節點,然後使用兩個函式
substring-after()
和去除該節點值的中間部分subsring-before()
。然後將 的輸出
xmlstarlet
分配給變數experiment_name
。或者,
xq
使用https://kislyuk.github.io/yq/experiment_name=$( xq -r '.RunParameters.ExperimentName | split("-")[1]' file.xml )
這只是在破折號上拆分節點的值並返回結果數組中的第二個元素。