我正在尝试编辑具有以下值的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。
谢谢
答案 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)
以下是仅使用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">