Linux

如何在 linux 中添加與其前一行對齊的行?

  • December 28, 2019

我有很多 xml 文件。有一個以 . 結尾的行</autoReferenceLines>。該行在不同的文件中可能有不同的前導空格。我想在該行下方添加一個新行,在所有文件中使用相同的前導空格。

我能夠添加新行,但我不知道如何使新行與前一行具有相同的對齊方式。

我現在擁有的是:

find ${location} -type f -name "*.xml" -path "**/adult/**" -exec sed -i '/<\/autoReferenceLines>/a <ztv>0<\/ztv>' {} +

編輯:

我注意到有一些用於 xml 編輯的工具,例如xmlstarlet. 但在我的這種情況下,最好只使用 bash 命令。我沒有安裝它的權限。

有沒有辦法計算特定行的前導空間?例如計算行的前導空格</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> 

使用 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我們沒有明確給出它。

引用自:https://unix.stackexchange.com/questions/559162