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

yae*_*ael 9 sed awk perl text-processing

如何从 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",
Run Code Online (Sandbox Code Playgroud)

预期成绩:

"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"
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 22

使用 GNU sed

sed -i '$s/,$//' file
Run Code Online (Sandbox Code Playgroud)

也就是说,在最后一行 ( $) 上用s空代替 ( ) 行 ( ,$)末尾的逗号。

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

标准sed

sed '$s/,$//' <file >file.new &&
mv file.new file
Run Code Online (Sandbox Code Playgroud)

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


ste*_*ver 6

对于就地编辑,您可以使用ed- 方便地,它在打开时默认将位置设置为最后一行,因此您无需明确解决最后一行:

ed file
s/,$//
wq
Run Code Online (Sandbox Code Playgroud)

或者,作为单线

printf 's/,$//\nwq\n' | ed -s file
Run Code Online (Sandbox Code Playgroud)

  • 在 bash 中,您可以像这样省略 `printf`:`ed -s file &lt;&lt;&lt; $'s/,$//\nwq\n'`(bash 手册中的搜索关键字是“here string”)。 (2认同)

Dig*_*uma 5

一般来说,我可能会采用直接的sed解决方案。但是,如果您的输入文件很大,您可能需要一个解决方案,它不需要花时间阅读整个文件来编辑最后几个字节。

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

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

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


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

truncate --size -2 lastcomma.txt
echo >> lastcomma.txt 
Run Code Online (Sandbox Code Playgroud)

  • GNU `truncate` 现在支持 `truncate -s -2 file` 将文件缩短两个字节。你想使用`stat -L`作为符号链接,你想要符号链接目标的大小(或者简单的`size=$(wc -c &lt; file)`)。 (2认同)
  • @malat,您不需要稀疏文件支持来截断文件。在这里,我们正在修剪文件末尾的数据。 (2认同)