shell 基于标记重命名xml

6ioyuze2  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(115)

我有许多xml文件,我需要根据xml中的特定标记(比如tag1="alpha")对每个文件进行重命名。
我已经弄清楚了如何根据特定标记的 * 单一 * 出现来重命名文件。
第一个
问题在于:一些文件有多个tag1标签,例如tag1="alpha"tag1="beta"tag1="omega"。对于这些文件,我还需要创建同一文件的副本,但使用其他名称,beta.xmlomega.xml
我试着用位置参数来匹配,但没有成功(我是一个初学者)。

文件结构示例:

<div class="div-entry">
 <d:entry xmlns:d="http://www.apple.com/DTDs/DictionaryService-1.0.rng" id="m_en_gbus0022390" tag1="Alhambra" class="entry">
   <span class="hg x_xh0">
     <span role="text" d:syl="1" homograph="1" class="hw">Al.ham.bra<d:syl/><span class="gp ty_hom tg_hw">1 </span></span>
     <span prxid="Alhambra_us_x" prlexid="pron0091531.002" dialect="AmE" class="prx"> | <span d:prn="US" id="m_en_gbus0022390.007" dialect="AmE" class="ph t_respell">alˈ;hambre;<d:prn/></span><span d:prn="IPA" id="m_en_gbus0022390.007" soundFile="alhambra#1_us_1" media="online" dialect="AmE" class="ph">&#593;lˈ;h&#593;mbre;<d:prn/></span> | </span>
   </span>
   <span class="sg">
     <span id="m_en_gbus0022390.003" class="se1 x_xd0">
       <span id="m_en_gbus0022390.004" class="msDict x_xd1 t_core">
         <span role="text" class="fg">
           <span class="gp tg_fg">(</span>
           <span tag1="the Alhambra"></span>
           <span class="gp tg_fg">) </span>
         </span>
         <span d:def="1" role="text" class="df">a fortified Moorish palace, the last stronghold of the Muslim kings of Granada, built between 1248 and 1354 near Granada in Spain<span class="gp tg_df">. </span><d:def/></span>
       </span>
     </span>
   </span>
 </d:entry>
</div>
jm2pwxwz

jm2pwxwz1#

好了,现在我们有:

$ xmlstarlet validate file.xml
file.xml - valid

因此我们可以提取标记值

$ xmlstarlet sel -t -v //@tag1 -n file.xml
Alhambra
the Alhambra

并将它们存储在bash数组中

$ readarray -t tag1 < <(xmlstarlet sel -t -v //@tag1 -n file.xml)
$ declare -p tag1
declare -a tag1=([0]="Alhambra" [1]="the Alhambra")

和重命名如下所示:

for tag in "${tag1[@]}"; do
  cp -v "$1" "$tag.xml"
done
rm -v "$1"

相关问题