Если использовать \n
перевод строки в качестве разделителя записей неудобно, используйте что-то еще.В этом случае вас особенно интересует последовательность ,\n)
, и мы можем позволить Perl найти это для нас, когда мы читаем файл:
perl -pe 'BEGIN{ $/ = ",\n)" } s/,\n\)/\n)/' input.txt >output.txt
Эта часть: $/ = ",\n)"
сообщает Perl, что вместоперебирая строки файла, он должен перебирать записи, оканчивающиеся последовательностью ,\n)
.Это помогает нам гарантировать, что каждый блок будет иметь не более одной такой последовательности, но, что более важно, эта последовательность не будет охватывать фрагменты (или записи, или чтения из файла).Каждое чтение фрагмента будет либо заканчиваться ,\n)
, либо, в случае окончательной записи, может заканчиваться отсутствием терминатора записи (по нашему определению терминатора).
Далее мы просто используем подстановку для удаления этой запятой внаша ,\n)
последовательность-разделитель записей.
Ключевым моментом здесь является то, что, установив в качестве разделителя записей именно ту последовательность, которая нам интересна, мы гарантируем, что последовательность не будет нарушена при чтении файлов.
Как уже упоминалось в комментариях, это решение наиболее полезно, только если промежуток между ,\n)
последовательностями не превышает объем памяти, который вы готовы использовать для решения проблемы.Скорее всего, сами новые строки встречаются в файле чаще, чем ,\n)
последовательностей, и поэтому это будет читаться большими кусками.Вы знаете, что ваш набор данных лучше, чем мы, и поэтому можете лучше судить о том, перевешивает ли простота этого решения объем его памяти.