我有一堆文件中包含以下内容:
<?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个配置文件。
答案 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,例如在您的情况下替换fstype
和path
这可能有效:
xmlstarlet ed -u '/parameter/volume[@fstype]/@fstype' -v cifs \
-u '/parameter/volume[@path]/@path' -v HOME file.xml