Я использую awk для обработки некоторых программных файлов, удаляя разделы отладки. Некоторые из этих файлов не имеют завершающей новой строки. Я хотел бы, чтобы awk печатал файл построчно, с новыми строками, но без добавления дополнительной новой строки в конце, если ее нет.
E.g.
a
b // no newline after the "b"
превращается в это:
a
b<NEWLINE>
Причина, по которой я не хочу добавлять эту новую строку, заключается в том, что я пытаюсь использовать cmp --silent $file $file_without_debug_sections
, чтобы определить, использовать ли исходный файл или новый. И причина, по которой меня волнует это, заключается в том, что я пытаюсь ограничить количество файлов с расширением отладки в выводе моего компилятора. Только использование версии без отладки, если она отличается, также дает понять, какие файлы были изменены этим процессом «удаления разделов отладки».
Итак, подведем итог: как я могу заставить awk просматривать файл построчно, но без добавления новой строки в конце, если она еще не существует?
Мой текущий код выглядит так:
{
if ($0 ~ /^[ \t]*\/\/[ \t]*\/\*[ \t]*begin[ \t]+debug[ \t]*$/) {
print "/* begin debug";
} else if ($0 ~ /^[ \t]*\/\/[ \t]*end[\ t]+debug[\t ]*\*\/[ \t]*$/) {
print "end debug */";
} else print;
}
Я попытался заменить print
в конце на printf "%s", $0
. Но тогда он вместо этого пропускает новую строку из каждой строки.
RT
для вывода того же терминатора или его отсутствия, что и на входе. gnu.org/software/gawk/manual/html_node/ gawk-split-records.html - person dave_thompson_085   schedule 05.01.2016print
вместоprintf "%s", $0
. В противном случае вы удалите любые разрывы строк.. - person hek2mgl   schedule 05.01.2016print
. (Извините, если это было неясно.) То, что выше, было моей демонстрацией вашей работы по решению проблемы с новой строкой. Использованиеprint
- это то, что вызывает проблему с добавлением новой строки, когда ее нет в оригинале. [[ОТРЕДАКТИРОВАНО сообщение, чтобы сделать его менее запутанным]] - person Chris Middleton   schedule 05.01.2016print
, но удалил завершающую новую строку (временно, если она есть) перед выполнением командыcmp
. Просто сравните файлы, не принимая во внимание возможный перевод строки в конце. - person hek2mgl   schedule 05.01.2016