替换文件中的一些文本字符串

时间:2017-10-14 05:50:17

标签: xml bash

我有一堆文件中包含以下内容:

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE config SYSTEM "/usr/share/xml/config/dtd/parameter.conf.xml.dtd">
<!--
See parameter.conf(5) for a description.
-->

<parameter>
    <debug enable="0" />

    <share>/bin/true</unshare>

    <shroptions require="nosuid,nodev" />

    <mksharepoint enable="1" remove="false" />

    <volume fstype="nfs" server="MEDIA-HOME-LAX.IT.DISNEY.COM" path="%(USER)" sharepoint="/home/%(USER)" sgrp="domain users" />
</parameter>

我想替换<volume ...行中的几个字符串,并在该行的末尾附近插入一些字符串:

<volume fstype="nfs" server="MEDIA-HOME-LAX.IT.DISNEY.COM" path="%(USER)" sharepoint="/home/%(USER)" sgrp="domain users" />

到此:

<volume fstype="cifs" server="MEDIA-HOME-LAX.IT.DISNEY.COM" path="HOME" sharepoint="/home/%(USER)" sgrp="domain users" options="vers=3.0" />

实现这一目标的最佳方法是什么?我有约。我想改变的1200个配置文件。

2 个答案:

答案 0 :(得分:0)

您可以尝试:find DIRECTORY | xargs sed -i 's/ORIGINAL/REPLACEMENT/g'

ORIGINAL是您尝试替换的字符串,REPLACEMENT是替换字符串,DIRECTORY是包含所有文件的文件夹。

这可以直接应用于案例1和2,您可以在其中将一个字符串替换为另一个字符串。

在第3种情况下,由于您希望将字符串附加到包含<volume的行,因此您可以将sed命令与捕获组一起使用,这将保存您的字符串的一部分以用于{{1部分。

正则表达式的一般示例:

REPLACEMENT

其中's/(KEEP)NOKEEP/\1REPLACEMENT/g' 是您要在KEEP中保存和使用的模式的一部分,NOKEEP是您要匹配的匹配模式的一部分,但不要想要保存,\1是您想要的任何替换字符串。

在这种情况下,案例3的正则表达式看起来像

REPLACEMENT

其中\ 1替换部分中的\ 1扩展为您捕获的线,减去最后一个尖括号。

为了使用捕获组,您可能需要使用带有sed的扩展正则表达式,这意味着您必须在sed命令中添加额外的's/(<volume.*)>$/\1options="vers=3.0">/g' -E标志:

-r

答案 1 :(得分:0)

执行此操作的最佳方式(如果是有效的XML)是使用xmlstarlet,例如在您的情况下替换fstypepath这可能有效:

xmlstarlet ed -u '/parameter/volume[@fstype]/@fstype' -v cifs \
    -u '/parameter/volume[@path]/@path' -v HOME file.xml