Awk
如何僅在文件的最後一行末尾添加單引號
我想要一個非 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 可能會嘗試進行歷史擴展。)…然後只需替換
file
為file.new
usingmv
。