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"
GNU sed
を使用:
sed -i '$s/,$//' file
つまり、最後の行($
)では、行の終わりにあるコンマ(s
)を何も置き換えない(,$
)。
-i
フラグにより、変更はインプレースで行われます。
標準のsed
を使用:
sed '$s/,$//' <file >file.new &&
mv file.new file
注:誰かが、「最後の行」を「最後の行」(または類似の何か)に変更する編集を提案しました。これは間違っています。 $
を使用してアドレス(編集コマンドを適用する行)を指定する場合、ストリームまたはファイルの最後の行を参照します。これは、正規表現で$
を使用した場合の異なるです。
インプレース編集の場合はed
を使用できます-便利なことに、デフォルトでは開始時に最終行に位置が設定されるため、最終行を明示的にアドレス指定する必要はありません。
ed file
s/,$//
wq
または、ワンライナーとして
printf 's/,$//\nwq\n' | ed -s file
一般的に、私はおそらく単純な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 truncate
がtruncate -s -2 file
をサポートして、ファイルを2バイト短縮することを指摘しています;このバージョンを使用している場合、上記は次のように単純化されます。
truncate --size -2 lastcomma.txt
echo >> lastcomma.txt