Xml
使用 sed 在 xml 標記中將一個字元替換為另一個字元
我需要
S
用T
in 替換字元:<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-num
S
你這樣做是
xmlstarlet
這樣的:xmlstarlet ed -u '//episode-num[starts-with(text(),"S")]' \ -x 'translate(text(),"S","T")' file.xml
這可能會修改任何
episode-num
節點,無論它們位於文件中的什麼位置。如果您只想修改特定節點,則將//episode-num
XPath 表達式更改為更精確的路徑。鑑於我上面的範例文件,上面的
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" } ] } }