Làm cách nào tôi có thể xóa dấu tách dấu phẩy cuối cùng khỏi phần cuối của tệp?


9

Làm cách nào để xóa dấu phẩy dấu phẩy cuối cùng khỏi tệp trên Linux?

Ví dụ về tập tin:

"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",

kết quả mong đợi:

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

Câu trả lời:


22

Sử dụng GNU sed:

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

Đó là, trên dòng cuối cùng ( $) thay thế ( s) dấu phẩy ở cuối dòng ( ,$) không có gì.

Việc thay đổi sẽ được thực hiện tại chỗ do -icờ.

Với tiêu chuẩn sed:

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

Lưu ý: Ai đó đã đề xuất một chỉnh sửa để thay đổi "trên dòng cuối cùng" thành "cuối cùng trên dòng" (hoặc một cái gì đó tương tự). Cái này sai. Khi $được sử dụng để chỉ định một địa chỉ (một dòng nơi áp dụng lệnh chỉnh sửa), thì nó đề cập đến dòng cuối cùng của luồng hoặc tệp. Điều này khác với việc sử dụng $trong một biểu thức thông thường.


6

Để chỉnh sửa tại chỗ bạn có thể sử dụng ed- một cách thuận tiện, nó đặt vị trí thành dòng cuối cùng theo mặc định khi mở để bạn không cần phải giải quyết rõ ràng dòng cuối cùng:

ed file
s/,$//
wq

Hoặc, như một lớp lót

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

2
Trong bash, bạn có thể phân phối printfnhư thế này: ed -s file <<< $'s/,$//\nwq\n'(từ khóa tìm kiếm trong hướng dẫn bash là "chuỗi ở đây").
Ruslan

5

Nói chung, có lẽ tôi sẽ đi với sedgiải pháp đơn giản . Tuy nhiên, nếu các tệp đầu vào của bạn rất lớn, bạn có thể muốn một giải pháp không mất thời gian để đọc qua toàn bộ tệp chỉ để chỉnh sửa vài byte cuối cùng.

Nếu bạn chắc chắn 100% tệp đầu vào của bạn kết thúc bằng dấu phẩy theo sau là một dòng mới, bạn có thể sử dụng truncateđể loại bỏ hai ký tự cuối cùng này, sau đó nối lại một dòng mới cuối cùng:

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

Điều này giả định một bản phân phối bao gồm GNU cắt ngắn hoặc tương đương.


@ StéphaneChazelas chỉ ra rằng GNU truncatehiện hỗ trợ truncate -s -2 filerút ngắn tệp bằng hai byte ; nếu bạn có phiên bản này, phần trên sẽ đơn giản hóa thành:

truncate --size -2 lastcomma.txt
echo >> lastcomma.txt 

... và một hệ thống tập tin hỗ trợtruncate
malat

@malat, hệ thống tập tin nào không hỗ trợ cắt ngắn?
Stéphane Chazelas

@ StéphaneChazelas Phải đây là từ kém. Làm thế nào về: [...] và một hệ thống tệp hỗ trợ tệp thưa để có hiệu quả truncate. OP mô tả giải pháp của anh ấy bắt đầu bằng: "nếu các tệp đầu vào của bạn rất lớn" ... do đó tôi nhận xét.
malat

2
GNU truncatehiện hỗ trợ truncate -s -2 filerút ngắn tệp bằng hai byte. Bạn muốn sử dụng stat -Lnhư cho các liên kết tượng trưng, ​​bạn muốn kích thước của mục tiêu của liên kết tượng trưng (hoặc đơn giản size=$(wc -c < file)).
Stéphane Chazelas

2
@malat, bạn không cần hỗ trợ tệp thưa thớt để cắt bớt tệp. Ở đây, chúng tôi đang cắt dữ liệu ở cuối tệp.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.