如何从 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