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