sed在XML属性中用短划线替换空格

时间:2014-02-19 20:59:03

标签: xml shell sed awk

我正在尝试编辑具有以下值的xml文件

<item type="4" key="Port 1 Desc" value_type="1">
<item type="4" key="Port 1 InOctets" value_type="3">
<item type="4" key="Port 1 OutOctets" value_type="3">

我想消除空间并重复它 - 我想要的输出将是这样的:

<item type="4" key="Port-1-Desc" value_type="1">
<item type="4" key="Port-1-InOctets" value_type="3">
<item type="4" key="Port-1-OutOctets" value_type="3">

请记住,数字1是可变的,我的xml文件有端口2,3,24 ..etc。

谢谢

4 个答案:

答案 0 :(得分:2)

使用sed

sed "{$(echo 's/ /-/3;'{,})}" file

$ cat file
<item type="4" key="Port 1 Desc" value_type="1">
<item type="4" key="Port 1 InOctets" value_type="3">
<item type="4" key="Port 1 OutOctets" value_type="3">

$ sed "{$(echo 's/ /-/3;'{,})}" file
<item type="4" key="Port-1-Desc" value_type="1">
<item type="4" key="Port-1-InOctets" value_type="3">
<item type="4" key="Port-1-OutOctets" value_type="3">

答案 1 :(得分:2)

此方法需要XMLStarlet

只要您的XML有效,它就具有工作的优势,而不是依赖于逐行格式化,正如许多其他答案一样。

elem=
xmlstarlet pyx | while IFS='' read -r line; do
  if [[ $line = '('* ]]; then
    elem=${line:1}
    printf '%s\n' "$line"
  elif [[ $line = Akey* && $elem = item ]]; then
    value=${line#*" "}
    value=${line//" "/_}
    printf 'Akey %s\n' "$value"
  else
    printf '%s\n' "$line"
  fi
done | xmlstarlet depyx

答案 2 :(得分:1)

我们更喜欢直接使用xml工具来处理xml文件,例如@Charles Duffy的回复。

以下是仅使用awk的文件的方式。

awk  '{gsub(/ /,"-",$4)}1' FS=\" OFS=\" file

<item type="4" key="Port-1-Desc" value_type="1">
<item type="4" key="Port-1-InOctets" value_type="3">
<item type="4" key="Port-1-OutOctets" value_type="3">

  • gsub(regexp, replacement [, target]) 搜索目标,查找它可以找到的所有最长,最左边,不重叠的匹配子字符串,并用替换替换它们。 gsub()中的'g'代表“全局”,这意味着无处不在。
  • FS=\" OFS=\"字段分隔符
  • 1与print
  • 相同

答案 3 :(得分:1)

以下是使用sed

的单行解决方案
sed 's/Port \([0-9]*\) /Port-\1-/g' filename

请注意,\1是记住的模式。

aman@apollo:~$ cat t

<item type="4" key="Port 1 Desc" value_type="1">
<item type="4" key="Port 1 InOctets" value_type="3">
<item type="4" key="Port 1 OutOctets" value_type="3">

aman@apollo:~$ sed 's/Port \([0-9]*\) /Port-\1-/g' t
<item type="4" key="Port-1-Desc" value_type="1">
<item type="4" key="Port-1-InOctets" value_type="3">
<item type="4" key="Port-1-OutOctets" value_type="3">