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
()

ulimit на файлы случайно не 2Gb?

Место свободного на диске достаточно? Он через временный файл делает изменения.

vel ★★★★★
()

А если не sed -i, а cat | sed > file?

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

А что за система? Такая хрень раньше наблюдалось на старом софте, особенно 32-х битном.

глянь на «ulimit -f». Вдруг он не unlimited?

vel ★★★★★
()
Ответ на: комментарий от 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 ★★★★★
()

Разве без этой первой части кода нельзя? Одним s///g обработать? Зачем оно?

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

sed ‘:again;$!N;$!b again;

Такие конструкции + 2G + sed? Не то, совсем не то! Для подобной комбинации смотри perl, либо на крайняк python.

anonymous
()

seд и AWK не жрутс более 100000 строк.

anonymous
()

Интересно, что зануды банятся. @Einstok_Fair, например. Вроде ещё кто-то даже был. То чувство, когда без аккаунта и пережил звездатых флудеров.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.