将 sed 与变量一起使用:

将 sed 与变量一起使用:

所以我使用 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并将其值从 更改falsetrue。效果很好。

接下来,我有另一个文件,其中包含以下参数:

<numberOfDisk>4</numberOfDisk>

现在,这里的值可以根据部署而改变。我想4用以下输出替换此处的数字或其他内容df -h | grep data0* | wc -l

df -h | grep data0* | wc -l因此,如果is的输出,则应将参数 from3的值替换为tonumberOfDisk43

我写了这个命令:

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 tos'`

有关如何解决此问题的任何意见?

答案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

相关内容