我想要一个非 Perl 解决方案,我应该能够在'
文件的最后一个可见(非转义字符)行附加单引号并将其保存回文件。
猫示例.txt
var1: 'funn'
var2: 'weee'
var3: 'youuuu
预期产出
猫示例.txt
var1: 'funn'
var2: 'weee'
var3: 'youuuu'
我知道如何使用打印最后一行awk
以及如何在每行末尾附加一个字符,但无法通过仅将单引号附加到最后一行并更新文件来更新文件。
答案1
该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
using mv
.