Вы должны избегать использования sed
, который является линейным инструментом и плохо справляется с подобными задачами.
Если вы настаиваете на использовании sed
и используете GNU sed
, вы можете, однако, использовать опцию -z
/ --null-data
, которая будет считывать весь файл за один проход (чтение записей, разделенных NUL-байтами, а не перевод строки). с разделенными записями) и позволит вам использовать шаблон )\n{
, как и следовало ожидать:
$ { echo "line1)"; echo "{line2"; } | sed -z 's/)\n{/X/g'
line1Xline2
Поскольку для этого требуется загрузка всего файла в память, ожидайте ужасных результатов для огромных файлов.
Если вам нравится неуправляемая тарабарщина, вы можете решить эту проблему с помощью менее известных sed
команд P
, t
и D
:
sed '/)$/{N;s/)\n{/) {\n\ttime_exe(__func__, cl(clock()));/;t;P;D}'
Это работает, загружая дополнительную строку в пространстве образца (N
), когда встречается строка, заканчивающаяся в )
, пытаясь заменить образец двух строк, и печать (P
) и удаление (D
) первой строки из пространства шаблона, если шаблон не сопоставлен (в противном случае t
переходит к следующей итерации), оставляя вторую строку в пространстве шаблона для использования в качестве первой строки следующей итерации.
Использование /first line pattern/{N;s/whole pattern/replacement/}
часто достаточно хорошо, но может потерпеть неудачу, поскольку N
будет использовать строку, с которой вы не будете тестировать шаблон первой строки. Это иллюстрируется здесь .
Да, они. В основном GC идет от "известных корней" (статические переменные, локальные переменные от всех стековых фреймов в потоках alll) для нахождения объектов, которые не могут быть собраны "мусор". Если нет никакого способа добраться до объекта от корня, это имеет право на набор.
Править: Tom указал на это, которое я думал, стоило снять в сам ответ:
Технически, статические переменные не являются корнями - на них ссылаются классы, на которые ссылаются загрузчики класса, на которые ссылаются классы, на которые ссылается объект, на которые ссылаются корневые ссылки.
Различие, вероятно, будет не важно большую часть времени, но хорошо знать :)
Стрельба по тарелочкам на деньгах, как обычно. Я только добавил бы, что ситуация, которую Вы описываете, является причиной, что подсчет ссылок (стандартная стратегия с ранними интеллектуальными указателями C++) не используется.
Проверьте это: Как Сборщик "мусора" Java Обрабатывает Сам Ссылки.
Можно хотеть проверить java.lang.ref.WeakReference