Bash

如何在 Bash 腳本中提取部分 XML 標記值

  • September 15, 2021

我有一個這樣的 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>

我想設置一個包含RUN61XML 標籤埠的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
)

這只是在破折號上拆分節點的值並返回結果數組中的第二個元素。

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