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


9

如何在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"

Answers:


22

使用GNU sed

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

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

由于该-i标志,更改将就地完成。

符合标准sed

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

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


6

对于就地编辑,您可以使用ed-方便地,它在打开时默认情况下将位置设置为最后一行,因此您无需显式地寻址最后一行:

ed file
s/,$//
wq

或者,作为单线

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

2
在bash中,您可以这样免除printfed -s file <<< $'s/,$//\nwq\n'(bash手册中用于搜索的关键字是“ here string”)。
Ruslan

5

通常,我可能会选择简单的sed解决方案。但是,如果您的输入文件很大,则可能需要一个不需要花时间就读取整个文件进行编辑的最后一个字节的解决方案。

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

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

假定发行版包含GNU截断或等效的GNU。


@StéphaneChazelas指出GNU truncate现在支持truncate -s -2 file将文件缩短两个字节。如果您具有此版本,则以上内容可简化为:

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

...以及支持的文件系统truncate
Malat

@malat,哪个文件系统不支持截断?
斯特凡Chazelas

@StéphaneChazelas对,这是措辞很差的。怎么样:[...]和支持稀疏文件的文件系统具有高效的性能truncate。OP从以下内容开始描述他的解决方案:“如果您的输入文件很大” ...因此,我发表了意见。
malat

2
GNU truncate现在支持truncate -s -2 file将文件缩短两个字节。您想将stat -L其用作符号链接,想要符号链接目标的大小(或简称size=$(wc -c < file))。
斯特凡Chazelas

2
@malat,您不需要稀疏文件支持来截断文件。在这里,我们将数据修剪到文件末尾。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.