Linux
如何在 linux 中添加與其前一行對齊的行?
我有很多 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
我們沒有明確給出它。