如何在linux中添加与其前一行的行对齐?

如何在linux中添加与其前一行的行对齐?

我有很多 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>])' {} \;

相关内容