web-dev-qa-db-ja.com

ファイルの末尾から最後のカンマ区切りを削除するにはどうすればよいですか?

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"
8
yael

GNU sedを使用:

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

つまり、最後の行($)では、行の終わりにあるコンマ(s)を何も置き換えない(,$)。

-iフラグにより​​、変更はインプレースで行われます。

標準のsedを使用:

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

注:誰かが、「最後の行」を「最後の行」(または類似の何か)に変更する編集を提案しました。これは間違っています。 $を使用してアドレス(編集コマンドを適用する行)を指定する場合、ストリームまたはファイルの最後の行を参照します。これは、正規表現で$を使用した場合の異なるです。

22
Kusalananda

インプレース編集の場合はedを使用できます-便利なことに、デフォルトでは開始時に最終行に位置が設定されるため、最終行を明示的にアドレス指定する必要はありません。

ed file
s/,$//
wq

または、ワンライナーとして

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

一般的に、私はおそらく単純なsedソリューションを使用します。ただし、入力ファイルが大きい場合は、最後の数バイトを編集するためだけにファイル全体を読み取るのに時間がかからないソリューションが必要になる場合があります。

入力ファイルがコンマで終了し、改行が続くことが100%確実である場合、 truncate を使用してこれらの最後の2文字を省略し、最後の改行を再度追加できます。 :

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

これは、GNU truncateまたは同等のものを含むディストリビューションを想定しています。


@StéphaneChazelasは、GNU truncatetruncate -s -2 fileをサポートして、ファイルを2バイト短縮することを指摘しています;このバージョンを使用している場合、上記は次のように単純化されます。

truncate --size -2 lastcomma.txt
echo >> lastcomma.txt 
5
Digital Trauma