Как удалить последний запятую из файла в 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"
text-processing
awk
sed
perl
Яэль
источник
источник
Ответы:
Используя GNU
sed
:То есть в последней строке (
$
) подставьте (s
) запятую в конце строки (,$
) ничем.Изменение будет сделано на месте из-за
-i
флага.Со стандартом
sed
:Примечание: кто-то предложил редактирование, чтобы изменить «в последней строке» на «последний в строке» (или что-то подобное). Это не верно. Когда
$
используется для указания адреса (строка, в которой нужно применить команду редактирования), тогда это относится к последней строке потока или файла. Это отличается от использования$
в регулярном выражении.источник
Для редактирования на месте вы могли бы использовать
ed
- удобно, при открытии он по умолчанию устанавливает позицию последней строки, поэтому вам не нужно явно обращаться к последней строке:Или, как однострочник
источник
printf
этого:ed -s file <<< $'s/,$//\nwq\n'
(ключевое слово для поиска в руководстве по bash - "здесь строка").В общем, я бы, наверное, пошел с простым
sed
решением. Однако, если ваши входные файлы огромны, вам может потребоваться решение, которое не займет время, чтобы прочитать весь файл только для редактирования последней пары байтов.Если вы на 100% уверены, что ваш входной файл оканчивается запятой, за которой следует
truncate
символ новой строки, вы можете использовать эти два последних символа, а затем повторно добавить последний символ новой строки:Предполагается, что дистрибутив включает усеченный GNU или эквивалентный.
@ StéphaneChazelas указывает, что GNU
truncate
теперь поддерживаетtruncate -s -2 file
сокращение файла на два байта ; если у вас есть эта версия, выше упрощается:источник
truncate
truncate
. ОП описывает свое решение, начиная с: «если ваши входные файлы огромны» ... отсюда мой комментарий.truncate
Теперь GNU поддерживаетtruncate -s -2 file
сокращение файла на два байта. Вы хотели бы использоватьstat -L
как для символических ссылок, вы хотите размер целевой символической ссылки (или простоsize=$(wc -c < file)
).