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


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"

回答:


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では、次のprintfように省略できますed -s file <<< $'s/,$//\nwq\n'(bashマニュアルでの検索のキーワードは「ここの文字列」です)。
ルスラン

5

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

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

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

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


@StéphaneChazelasは、GNU がファイルを2バイト短縮することを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、ファイルを2バイト短縮することをサポートしています。stat -Lシンボリックリンクと同じように使用したい場合、シンボリックリンクのターゲットのサイズが必要です(または単にsize=$(wc -c < file))。
ステファンChazelas

2
@malat、ファイルを切り捨てるためにスパースファイルのサポートは必要ありません。ここでは、ファイルの末尾からデータをトリミングしています。
ステファンChazelas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.