Ashar Asked: 2022-03-28 08:42:47 +0800 CST2022-03-28 08:42:47 +0800 CST 2022-03-28 08:42:47 +0800 CST 如何仅在文件的最后一行末尾添加单引号 [重复] 772 我想要一个非 perl 解决方案,我应该能够'在文件的最后一个可见(非转义字符)行附加一个单引号并将其保存回文件。 猫示例.txt var1: 'funn' var2: 'weee' var3: 'youuuu 预期产出 猫示例.txt var1: 'funn' var2: 'weee' var3: 'youuuu' 我知道如何使用打印最后一行awk以及如何在每行末尾附加一个字符,但无法通过仅将单引号附加到最后一行并更新文件来更新文件。 awk sed 1 个回答 Voted Best Answer they 2022-03-28T08:50:17+08:002022-03-28T08:50:17+08:00 该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.newusing mv。
该
sed
表达式$s/$/'/
在输入的最后一行末尾添加一个单引号。第一个$
是最后一行的“地址”。当找到最后一行时,这将触发给定的替换s
命令。$
该命令用单引号替换正则表达式中匹配的行尾。您是否只想在该行末尾没有单引号时才执行替换,然后使用
$s/[^']$/&'/
. 这会将最后一行的最后一个字符替换为它自己,后跟一个单引号,但前提是最后一个字符不是单引号。当然,这确实要求行上至少有一个字符。在 shell 中,您可以
sed
在双引号中使用这些表达式,但您需要从 shell 中转义两个美元符号:如果您
sed
支持它,您可以使用它-i
来对文件执行就地编辑。要将其仅应用于文件中的最后一个非空行(并删除尾随的仅空白行),首先,删除文件末尾的空白行。一种方法是使用以下管道:
这使用 GNU 反转文件的行
tac
,删除所有行,直到第一个非空白行(“非空白”意味着它上面有一些图形字符;您可以使用[^[:space:]]
代替[[:graph:]]
),然后再次反转行.修改此管道输出的最后一行:
或者,结合这两个
sed
调用:(请注意,
!
如果没有它,某些 shell 可能会尝试进行历史扩展。)...然后只需替换
file
为file.new
usingmv
。