Xml

使用 sed 在 xml 標記中將一個字元替換為另一個字元

  • February 3, 2022

我需要STin 替換字元:

<episode-num system="onscreen">S1 E12</episode-num>

我期望的結果:

<episode-num system="onscreen">T1 E12</episode-num>

我不知道Git如何深入工作,我只是用它來替換我的xml標籤中的那個字元,在論壇中研究我找到了一些資訊並嘗試了以下命令行:

sed -e :l -e 's@\(<episode-num system="onscreen">.*\)S\([^amp;]\)\(.*</episode-num>\)@\1T\2\3@;tl' guide.xml

但它不起作用,我希望你能幫助我。

僅當行包含另一個字元串時才替換某些字元串sed

我們只替換包含字元串的行free

sed '/free/s/i/I/g' example.txt
  • '/free/s/i/I/g'
    • /free/- 僅在包含此字元串時替換行
    • s- sed 的替代命令
    • /i/- 我們想要匹配什麼正則表達式
    • /I/- 替換匹配的子字元串
    • /g- 替換標誌,對行上的所有匹配項進行重複替換

您的假設的解決方案

你的測試字元串是<episode-num system="onscreen">

假設您有一個包含以下內容的文件:

$ cat test.xml 
<data>
<episode-num system="onscreen">S1 E11</episode-num>
<episode-num system="onscreen">S1 E12</episode-num>
<episode-num system="onscreen">T1 E13</episode-num>
<some data>S1 E1</episode-num>
</data>

您的 sed 解決方案是:

$ sed '/<episode-num system="onscreen">/s/S/T/g' test.xml 
<data>
<episode-num system="onscreen">T1 E11</episode-num>
<episode-num system="onscreen">T1 E12</episode-num>
<episode-num system="onscreen">T1 E13</episode-num>
<some data>S1 E1</episode-num>
</data>

此解決方案的來源在這裡

假設您有一些 XML 文件,例如

<data>
<episode-num system="onscreen">S1 E12</episode-num>
<episode-num system="onscreen">S1 S12</episode-num>
<episode-num system="onscreen">T1 S12</episode-num>
</data>

…並且您想用 .開頭的節點值中的所有字元替換所有S字元。T``episode-numS

你這樣做是xmlstarlet這樣的:

xmlstarlet ed -u '//episode-num[starts-with(text(),"S")]' \
   -x 'translate(text(),"S","T")' file.xml

這可能會修改任何episode-num節點,無論它們位於文件中的什麼位置。如果您只想修改特定節點,則將//episode-numXPath 表達式更改為更精確的路徑。

鑑於我上面的範例文件,上面的xmlstarlet命令將產生

<?xml version="1.0"?>
<data>
 <episode-num system="onscreen">T1 E12</episode-num>
 <episode-num system="onscreen">T1 T12</episode-num>
 <episode-num system="onscreen">T1 S12</episode-num>
</data>

xq使用(來自https://kislyuk.github.io/yq/)進行與上述相同的操作xmlstarlet

xq -x '(.data."episode-num"[] | select (."#text"|startswith("S")))."#text" |= gsub("S";"T")' file.xml

這假設輸入文件與我的範例文件具有相同的結構。它使用 XML 解析器解析文件,然後在內部將其轉換為 JSON。它呼叫jq生成的 JSON 文件以應用給定的表達式,最後將所有內容再次轉換回 XML。

表達式實際應用到的內部 JSON 文件jq如下所示,對於我正在使用的範例文件:

{
 "data": {
   "episode-num": [
     {
       "@system": "onscreen",
       "#text": "S1 E12"
     },
     {
       "@system": "onscreen",
       "#text": "S1 S12"
     },
     {
       "@system": "onscreen",
       "#text": "T1 S12"
     }
   ]
 }
}

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