Text-Processing

如何在 XML 文件中將某些指定標籤中的特定字元串替換為嵌入在標籤中的其他字元串

  • May 2, 2022

我需要在 XML 文件中將某些指定標籤中的特定字元串替換為嵌入在標籤中的其他字元串。

搜尋每次出現的範例,僅當它在標籤內(在其他標籤內)時才an example需要替換:<b>a test</b>``<a> ... </a>

  • 輸入範例:
<c>This is an example. <a>This is an example;</a></c>
  • 期望的輸出:
<c>This is an example. <a>This is <b>a test;</b></a></c>

好像你想

  1. 從XML 文件an example;中節點的值中刪除文本,以及/c/a
  2. /c/a向名為的節點添加一個子節點b,其值為a test;

xmlstarlet您可以在 shell中輕鬆做到這一點:

xmlstarlet ed -u '/c/a' -x 'substring-before(text(), "an example;")' file.xml |
xmlstarlet ed -s '/c/a' -t elem -n 'b' -v 'a test;'

對問題中範例文件的第一次呼叫xmlstarlet將導致以下輸出,其中一些文本從/c/a節點的值中刪除:

<?xml version="1.0"?>
<c>This is an example. <a>This is </a></c>

第二次呼叫採用此修改後的文件並通過引入/c/a/b節點生成以下內容:

<?xml version="1.0"?>
<c>This is an example. <a>This is <b>a test;</b></a></c>

xmlstarlet呼叫可以組合成單個命令。下面,我使用了長選項,也--inplace用於對原始文件進行就地編輯(這僅用於說明,您應該--inplace先執行而不確定轉換是否有效):

xmlstarlet ed --inplace \
   --update  '/c/a' -x 'substring-before(text(), "an example;")' \
   --subnode '/c/a' -t elem -n 'b' -v 'a test;' file.xml

將上述內容概括為對包含文本的任何a節點執行兩次編輯的內容an example;(這是問題中實際要求的內容):

xmlstarlet ed \
   --var paths '//a[contains(text(), "an example;")]'  \
   --update  '$paths' -x 'substring-before(text(), "an example;")' \
   --subnode '$paths' -t elem -n 'b' -v 'a test;' file.xml 

這裡唯一的新事物是我們首先將要編輯的所有節點的路徑儲存在內部變數$paths中。--update然後我們在和--subnode修改中引用這些路徑。

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