LINUX.ORG.RU

sed не работает с большими файлами

 


0

2

Здравствуйте Столкнулся с проблемой что sed не отрабатывает на файле размером от 2 гигабайт, на части этого файла отрабатывает. Не отрабатывает это значит что-то делает, ошибок нет, но файл не меняется.

Нужно убрать из файла все что в фигурных скобках и сами скобки вот это работает как надо sed -i ‘:again;$!N;$!b again; s/{[^}]*}//g’

но только на файлах меньше 2гб

нужен аналог без написания своих программ только стандартные утилиты

в прошлы раз при похожей проблеме спасла команда tr + mv

sed -i

спасла команда tr + mv

sed -i - это и есть sed + mv. Sed создает временный файл размером 2+ ГБ, а места нет. Вот и получаем или ошибку или неправильные данные.

anonymous ()
Ответ на: комментарий от vel

Место свободного на диске достаточно?

Насколько помню, sed временные файлы создает в $TMP, который обычно /tmp, который обычно tmpfs, который не более 2ГБ в ОЗУ.

anonymous ()
Ответ на: комментарий от Sintetik

Вообще-то, всё, о чём писали выше - не по делу.
Ты пишешь:

  sed ‘
   : again
   $ !N
   $ !b again
   s/{[^}]*}//g
  ’
т.е. пытаешься прочесть весь файл в буфер.
Между тем (man 1p sed):

The pattern and hold spaces shall each be able to hold at least 8192 bytes.

т.е. всё, что больше - это подарок от GNU, и увеличить его сверх 2GiB можно(?) только нетривиальной правкой sed.
В принципе, можно сделать это и sed-ом (при условии, что там нет слишком длинных строк, но проще взять awk.
Или даже на shell через 'IFS=" read -r Line' реализовать простенький конечный автомат, если в файле нет символов \0x00. Правда, работать будет долго.

ABW ★★★★★ ()