파일 끝에서 마지막 쉼표 구분 기호를 제거하는 방법은 무엇입니까?

파일 끝에서 마지막 쉼표 구분 기호를 제거하는 방법은 무엇입니까?

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"

답변1

GNU 사용 sed:

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

즉, 마지막 줄( $) 에서 s줄 끝( )의 쉼표( )를 ,$아무것도 없는 것으로 바꿉니다.

플래그로 인해 변경 사항은 내부에서 수행됩니다 -i.

표준 sed:

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

참고: 누군가 "마지막 줄"을 "마지막 줄"(또는 이와 유사한 것)로 변경하는 편집을 제안했습니다. 이것은 잘못된 것입니다. $주소(편집 명령이 적용되는 행)를 지정하는 데 사용되는 경우 스트림 또는 파일의 마지막 행을 나타냅니다. 이것은다른$정규식에 사용됩니다.

답변2

내부 편집의 경우 ed이 기능을 편리하게 사용할 수 있습니다. 열릴 때 기본적으로 위치가 마지막 줄로 설정되므로 마지막 줄을 명시적으로 처리할 필요가 없습니다.

ed file
s/,$//
wq

아니면 한 줄로

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

답변3

일반적으로 말하면 아마도 쉬운 해결책을 택할 것입니다 sed. 그러나 입력 파일이 큰 경우 전체 파일을 읽는 데 시간이 걸리지 않고 마지막 몇 바이트만 편집하는 솔루션이 필요할 수 있습니다.

입력 파일이 쉼표와 개행 문자로 끝나는 것이 100% 확실하다면 다음을 사용할 수 있습니다.truncate마지막 두 문자를 제거하고 마지막 줄 바꿈을 다시 추가하십시오.

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 

관련 정보