【问题标题】:Using sed for introducing newline after each > in a +1 gigabyte large one-line text file使用 sed 在 +1 GB 大单行文本文件中的每个 > 之后引入换行符
【发布时间】:2011-01-28 22:27:05
【问题描述】:

我有一个巨大的文本文件(大约 1.5 GB),其中包含 xml 数据。文件中的所有文本都在一行上,并且尝试在任何文本编辑器中打开它(即使是在此线程中提到的那些:Text editor to open big (giant, huge, large) text files)要么失败,要么完全无法使用,因为文本编辑器在尝试滚动时挂起.

我希望通过使用以下 sed 命令在文件中引入换行符

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

遗憾的是,这导致 sed 给我一个分段错误。据我了解,sed 逐行读取文件,在这种情况下,这意味着它尝试在一行中读取整个 1,5 gig 文件,这肯定会解释段错误。但是,问题仍然存在。

如何在 xml 文件中的每个 > 之后引入换行符?我是否必须通过逐个字符读取文件来编写一个小程序来为我执行此操作?

【问题讨论】:

  • 你可能会有更多的运气。
  • tr 看起来是个很有用的工具,我以前不知道这个工具,谢谢你告诉我!
  • +1;有趣的问题

标签: xml sed newline


【解决方案1】:

This 可能适合你。

【讨论】:

    【解决方案2】:

    一些 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
    

    【讨论】:

    • 不错,但可以通过以下方式优化:while read -n 1000 str ; do echo -n "$str" | sed 's/&gt;/&gt;\n/g' ; done &lt; file
    • 哦,相信我,我已经问过自己好几次了,为什么一开始就在一行中(通常是一些非常有创意的诅咒):) 遗憾的是,我无能为力。不过,一次读一个字符的想法似乎效果很好。我希望不必这样做,但它确实有效。谢谢!
    • @Chen,我会减少使用sed,只使用内部外壳替换
    • @ghostdog74,我认为你的建议很酷,但我计时了while read -n 1000 str ; do echo -ne "${str//&gt;/&gt;\n}" ; done &lt; file,结果却明显慢了很多。甚至比上面的一次一个字符的代码还要慢。
    • 我不相信。调用外部命令肯定比调用内置命令慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2019-01-19
    • 2011-01-22
    • 2013-08-29
    • 2018-12-16
    相关资源
    最近更新 更多