要使用 Shell 命令刪除 XML 格式中雙引號內的空格(僅處理屬性值中的空格,保留標簽外的空格),可以使用以下 sed 命令:
sed -i ':loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop' filename.xml
命令詳解:
-
核心邏輯:
s/\("[^"]*\) \([^"]*"\)/\1\2/g
:
匹配雙引號內的內容,將捕獲分組\1
(雙引號后到空格前的文本)和\2
(空格后到雙引號結束的文本)合并,從而刪除一個空格。:loop; t loop
:
通過循環重復執行替換,直到一行中所有雙引號內的空格都被刪除。
-
關鍵特性:
- 僅處理屬性值(如
name="John Doe"
→name="JohnDoe"
),標簽外的空格(如縮進、換行)保留不變。 - 支持一行內多個屬性(如
<tag a="val 1" b="val 2">
→<tag a="val1" b="val2">
)。
- 僅處理屬性值(如
示例驗證:
輸入 XML:
<data><item name="Product 123" price="100 USD"/><info desc="A test example" />
</data>
執行命令后:
<data><item name="Product123" price="100USD"/><info desc="Atestexample" />
</data>
系統適配:
- Linux/macOS(BSD sed):
直接運行上述命令(macOS 需先安裝 GNU sed,或改用sed -i '' '...'
)。 - Windows(Git Bash/WSL):
確保在 Bash 環境中運行,語法相同。
注意事項:
- 不處理轉義雙引號:
若屬性值包含轉義雙引號(如\"
),此命令可能出錯。復雜 XML 建議使用專業解析器(如xmlstarlet
)。 - 備份文件:
首次使用建議先備份文件,或去掉-i
測試輸出:sed ':loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop' filename.xml
替代方案(簡單場景):
若空格僅出現在屬性值中間(非開頭/結尾),可用簡化命令:
sed -i 's/\(="[^"]*\) /\1/g' filename.xml
此方法基于 Shell 文本處理邏輯,通過循環替換解決邊界問題。對于含轉義或嵌套結構的 XML,推薦使用專用工具如
xmlstarlet
。
相關問題
- 如何保留屬性值中的特定空格(如英文單詞間的單個空格)?
- 使用
awk
處理 XML 文件時,如何安全刪除雙引號內的空格? - 若 XML 屬性值包含轉義字符(如
"
),應如何避免解析錯誤?
-
: 引用[2]: shell中空格的使用;空格替換;通配符。空格替換 將多個空格替換為一個空格 sed ‘s/[ ][ ]/ /g’ filename sed -e 's/[[:space:]][[:space:]]/ /g’ filename 將1到10個空格替換為一個空格 sed ‘s/[ ]{1,10}/ /g’ filename 去掉多余空格 echo “hello world” | tr -s ‘[[:space:]]’ http://www.runoob.com/linux/linux-comm-tr.html http://wiki.jikexueyuan.com/project/unix/regular-expressions.html
- 引用[1]:【Shell】Sed 刪除、替換、增加字符串。方式3: 使用單引號,變量直接引用,但是需要通過 eval 執行這個sed命令。eval會對后面Shell命令進行兩遍掃描,如果第一遍掃描后,Shell命令是個普通命令,則執行此命令;如果Shell命令是含有變量的間接引用,則保證間接引用的語義 #!/bin/bash name=tomas eval sed -i ‘s/rose/${name}/g’ name.txt 變量中存在特殊字符處理