Использование sed для ввода новой строки после каждого> в большом однострочном текстовом файле размером +1 гигабайт - PullRequest
4 голосов
/ 18 марта 2010

У меня есть гигантский текстовый файл (около 1,5 гигабайт) с XML-данными в нем. Весь текст в файле находится в одной строке и пытается открыть его в любом текстовом редакторе (даже упомянутом в этой теме: Текстовый редактор для открытия больших (гигантских, огромных, больших) текстовых файлов ) либо ужасно дает сбой, либо полностью непригоден из-за зависания текстового редактора при попытке прокрутки.

Я надеялся ввести в файл символы новой строки, используя следующую команду sed

sed 's/>/>\n/g' data.xml > data_with_newlines.xml

К сожалению, это привело к тому, что sed дал мне ошибку сегментации. Из того, что я понимаю, sed читает файл построчно, что в данном случае означает, что он пытается прочитать весь 1,5-гигабайтный файл в одну строку, что наверняка объяснит segfault. Однако проблема остается.

Как ввести новые строки после каждого> в XML-файле? Нужно ли прибегать к написанию небольшой программы, чтобы сделать это для меня, читая файл символ за символом?

Ответы [ 2 ]

4 голосов
/ 18 марта 2010

у некоторого sed есть ограничение на это. GNU sed не имеет ограничений, поскольку он может «malloc ()» больше (виртуальной) памяти, вы можете кормить или строить строки так долго, как вам нравится. (из документа)

Я бы предложил, если это возможно, изменить способ создания этого XML-файла. (Почему все это в одну строку в первую очередь?). В противном случае, вы можете прочитать его один за другим. например, используя оболочку

while read -n 1 ch
do
  case "$ch" in
   ">" ) printf "%s\n" "$ch";;
     *) printf "%s" $ch;;
  esac
done <"file"

или

while read -n 1000 str ; do
 echo "${str//>/>
}"
done < file
0 голосов
/ 11 декабря 2011

Это может работать для вас.

...