Awk

如何僅在文件的最後一行末尾添加單引號

  • March 27, 2022

我想要一個非 perl 解決方案,我應該能夠'在文件的最後一個可見(非轉義字元)行附加一個單引號並將其保存回文件。

貓範例.txt

var1: 'funn'
var2: 'weee'
var3: 'youuuu

  

預期產出

貓範例.txt

var1: 'funn'
var2: 'weee'
var3: 'youuuu'

我知道如何使用列印最後一行awk以及如何在每行末尾附加一個字元,但無法通過僅將單引號附加到最後一行並更新文件來更新文件。

sed表達式$s/$/'/在輸入的最後一行末尾添加一個單引號。第一個$是最後一行的“地址”。當找到最後一行時,這將觸發給定的替換s命令。$該命令用單引號替換正則表達式中匹配的行尾。

您是否只想在該行末尾沒有單引號時才執行替換,然後使用$s/[^']$/&'/. 這會將最後一行的最後一個字元替換為它自己,後跟一個單引號,但前提是最後一個字元不是單引號。當然,這確實要求行上至少有一個字元。

在 shell 中,您可以sed在雙引號中使用這些表達式,但您需要從 shell 中轉義兩個美元符號:

sed "\$s/\$/'/" file
sed "\$s/[^']\$/&'/" file

如果您sed支持它,您可以使用它-i來對文件執行就地編輯。

要將其僅應用於文件中的最後一個非空行(並刪除尾隨的僅空白行),首先,刪除文件末尾的空白行。一種方法是使用以下管道:

tac file | sed '1,/[[:graph:]]/ { /[[:graph:]]/!d; }' | tac

這使用 GNU 反轉文件的行tac,刪除所有行,直到第一個非空白行(“非空白”意味著它上面有一些圖形字元;您可以使用[^[:space:]]代替[[:graph:]]),然後再次反轉行.

修改此管道輸出的最後一行:

tac file | sed '1,/[[:graph:]]/ { /[[:graph:]]/!d; }' | tac |
sed "\$s/\$/'/" >file.new

或者,結合這兩個sed呼叫:

tac file | sed "1,/[[:graph:]]/ { /[[:graph:]]/\!d; s/\$/'/; }" | tac >file.new

(請注意,!如果沒有它,某些 shell 可能會嘗試進行歷史擴展。)

…然後只需替換filefile.newusing mv

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