我有很多 xml 文件。有一个以 结尾的行</autoReferenceLines>
。该行在不同文件中可能有不同的前导空格。我想在该行下方添加一个新行,并在所有文件中使用相同的前导空格。
我能够添加新行,但我不知道如何使新行与前一行具有相同的对齐方式。
我现在拥有的是这样的:
find ${location} -type f -name "*.xml" -path "**/adult/**" -exec sed -i '/<\/autoReferenceLines>/a <ztv>0<\/ztv>' {} +
编辑:
我注意到有一些用于 xml 编辑的工具,例如xmlstarlet
.但就我而言,最好只使用 bash 命令。我没有安装它的权限。
有没有办法计算特定行的前导空格?例如计算 line 的前导空格</autoReferenceLines>
编辑2:
输入:
<Parameter>
<autoTransfer>Nowhere</autoTransfer>
<toFilm>0</toFilm>
<autoReferenceLines>0</autoReferenceLines>
</Parameter>
Bug在不同的文件中,缩进不一样。所以每行的前导空格是不同的。
预期输出:
</Parameter>
<autoTransfer>Nowhere</autoTransfer>
<toFilm>0</toFilm>
<autoReferenceLines>0</autoReferenceLines>
<ztv>0</ztv>
</Parameter>
答案1
使用 Gnu sed 你可以做到这一点。我使用你的 find 命令并修改了其中的 sed 部分。
$ find ${location} -type f -name "*.xml" -path "*/adult/*" -exec sed -i -e '/<\/autoReferenceLines>/!b' -e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' {} +
或者,通过转义换行符展开,但仍视为一行:
$ find ${location} -type f \
-name "*.xml" -path "*/adult/*" \
-exec sed -i \
-e '/<\/autoReferenceLines>/!b' \
-e 'h;s/\S.*/<ztv>0<\/ztv>/;H;g' \
{} +;
在职的:
您find
写得很好,选择了需要编辑的所需文件sed
。
sed 命令查看存在自动引用字符串的行。它存储一个副本:h
在我们开始对其进行手术之前。然后从第一个非空白开始\S
到行尾,我们将其全部删除。所以现在我们只剩下前导空格(如果有的话)。当我们这样做时,我们也粘贴所需的字符串 ztv 。所以现在我们有相同数量的前导空格加上所需的字符串。
接下来,我们将刚刚创建的字符串附加到原始存储行H
并将g
其放入模式空间。
-i
当与 gnu sed 的多个文件一起使用时,该选项意味着-s
,所以我们没有明确给出它。
答案2
该命令应该执行您想要的操作:
find ${location} -type f -name "*.xml" -path "**/adult/**" -exec grep -q '</autoReferenceLines>' {} \; -exec perl -i"*" -ne 'print; print "$1<ztv>0</ztv>\n" if (m[^(\s*).*</autoReferenceLines>])' {} \;