如何从文件末尾删除最后一个逗号分隔符?

如何从文件末尾删除最后一个逗号分隔符?

如何从 Linux 上的文件中删除最后一个逗号分隔符?

文件示例:

"is_supported_kafka_ranger" : "true",
"kafka_log_dir" : "/var/log/kafka",
"kafka_pid_dir" : "/var/run/kafka",
"kafka_user" : "kafka",
"kafka_user_nofile_limit" : "128000",
"kafka_user_nproc_limit" : "65536",

预期成绩:

"is_supported_kafka_ranger" : "true",
"kafka_log_dir" : "/var/log/kafka",
"kafka_pid_dir" : "/var/run/kafka",
"kafka_user" : "kafka",
"kafka_user_nofile_limit" : "128000",
"kafka_user_nproc_limit" : "65536"

答案1

使用 GNU sed

sed -i '$s/,$//' file

也就是说,在最后一行 ( $)中,将s行 ( ) 末尾的逗号 ( )替换,$为空。

由于标志的原因,更改将就地完成-i

与标准sed

sed '$s/,$//' <file >file.new &&
mv file.new file

注意:有人建议进行编辑,将“最后一行”更改为“最后一行”(或类似的内容)。这是错误的。当$用于指定地址(应用编辑命令的行)时,它指的是流或文件的最后一行。这是不同的$在正则表达式中使用。

答案2

对于就地编辑,您可以ed方便地使用 - 它在打开时默认将位置设置为最后一行,因此您不需要显式地处理最后一行:

ed file
s/,$//
wq

或者,作为单行

printf 's/,$//\nwq\n' | ed -s file

答案3

一般来说,我可能会选择简单的sed解决方案。但是,如果您的输入文件很大,您可能需要一个解决方案,该解决方案不需要花时间读取整个文件而只是编辑最后几个字节。

如果您 100% 确定您的输入文件以逗号后跟换行符结尾,则可以使用truncate删除最后两个字符,然后重新附加最后一个换行符:

filesize=$(stat -L --format "%s" lastcomma.txt)
truncate --size $((filesize - 2)) lastcomma.txt 
echo >> lastcomma.txt 

这假设发行版包含 GNU truncate 或等效版本。


@StéphaneChazelas 指出GNUtruncate现在支持truncate -s -2 file将文件缩短两个字节;如果你有这个版本,上面的内容简化为:

truncate --size -2 lastcomma.txt
echo >> lastcomma.txt 

相关内容