所以我使用 sed 来查找和替换某些字符串:
情况 1. 文件中的值始终是常量。我想将参数从 false 替换为 true。所以我使用这个命令:
sed -i -e 's/entry key="ignore_vc_cert" value="false"/entry key="ignore_vc_cert" value="true"/g' /usr/local/avamar/var/mc/server_data/prefs/mcserver.xml
这将找到ignore_vc_cert
并将其值从 更改false
为true
。效果很好。
接下来,我有另一个文件,其中包含以下参数:
<numberOfDisk>4</numberOfDisk>
现在,这里的值可以根据部署而改变。我想4
用以下输出替换此处的数字或其他内容df -h | grep data0* | wc -l
df -h | grep data0* | wc -l
因此,如果is的输出,则应将参数 from3
的值替换为tonumberOfDisk
4
3
我写了这个命令:
sed -e s/"$(cat /usr/local/vdr/etc/vdr-configuration.xml | grep -i numberOfDisk)"/<numberOfDisk>"$(df -h | grep data0* | wc -l)"</numberOfDisk>/g > /usr/local/vdr/etc/vdr-configuration.xml
但出于某种原因,我得到numberOfDisk: No such file or directory
如果我做:
sed -e 's/"$(cat /usr/local/vdr/etc/vdr-configuration.xml | grep -i numberofdisk)"/<numberOfDisk>"$(df -h | grep data0* | wc -l)"</numberOfDisk>/g' /usr/local/vdr/etc/vdr-configuration.xml
然后我得到:sed: -e expression #1, char 15: unknown option to
s'`
有关如何解决此问题的任何意见?
答案1
要操作 XML 文档,请使用 XML 解析器/工具。
我会和xmlstarlet。
grep -c 'data0*'
- 将输出匹配的行数,无需管道wc -l
xmlstarlet ed -u "//numberOfDisk" -v $(df -h | grep -c 'data0*') /usr/local/vdr/etc/vdr-configuration.xml > /tmp/tmp-test.xml
&& mv /tmp/tmp-test.xml /usr/local/vdr/etc/vdr-configuration.xml
ed
- 编辑模式
-u
( --update
) - 更新 xml 文档
答案2
尝试这个。将现有磁盘数之前的所有内容抓取到 \1 中,将之后的内容抓取到 \2 中。然后打印 \1,然后是输出df ...
,然后是 \2。
sed -e 's/\(^.*numberOfDisk>\)[0-9]*\(<.*\)/\1'$(df -h | grep -c data0)'\2/' vdr-configuration.xml
另一种(更短的)方法
sed -e '/numberOf/s/[0-9]\+/'$(df -h|grep -c data0)'/' vdr-configuration.xml