だから私は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の場合は、パラメータの値fromを3
toに置き換える必要があります。numberOfDisk
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