Text-Processing
如何在 XML 文件中將某些指定標籤中的特定字元串替換為嵌入在標籤中的其他字元串
我需要在 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>
好像你想
- 從XML 文件
an example;
中節點的值中刪除文本,以及/c/a
/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
修改中引用這些路徑。