如何仅在文件的最后一行末尾添加单引号

如何仅在文件的最后一行末尾添加单引号

我想要一个非 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 可能会尝试进行历史扩展。)

...然后只需替换filefile.newusing mv.

相关内容