使用 linux 重新格式化被屠杀的文本

reformat butchered text using linux

我有一些文本格式如下:

                1   一项庄严肃穆富历史意义的仪式标志中华人民共和国对香港恢复行使主权。
                2   英国皇储威尔斯亲王与中华人民共和国国家主席江泽民均在仪式上致辞,仪式於六月三十日午夜至七月一日凌晨举行,并向全世界直播。
                3   仪式在香港会议展览中心新翼大厅举行,约四千名嘉宾出席,包括来自四十多个国家和国际性组织的外交部长和知名人士,以及约四百名各国传媒
代表。

这是 hyper-massive 文档的一部分。

我想做的是删除句子开头之前的所有内容,即所有白色space 和行号,同时完整保留句子。

在 linux 上执行此操作的快速有效方法是什么?

另一个挑战是一些行已经分开并向下移动到较低的行,这是有问题的,理想情况下我想将这些组件重新附加到它们来自的句子,即直接在它们上面的句子。上例中的最后一句话就是例证。

我想这可以用正则表达式或 sed 来完成,但我对这些工具很不熟悉。

也许作为预处理步骤,有一个命令可以将前面没有白色 space 和数字的所有内容都显示在新行上,并将其附加到上一行的末尾?

你可以像下面这样使用 sed,

$ sed 's/^[[:blank:][:digit:]]\+//' file
一项庄严肃穆富历史意义的仪式标志中华人民共和国对香港恢复行使主权。
英国皇储威尔斯亲王与中华人民共和国国家主席江泽民均在仪式上致辞,仪式於六月三十日午夜至七月一日凌晨举行,并向全世界直播。
仪式在香港会议展览中心新翼大厅举行,约四千名嘉宾出席,包括来自四十多个国家和国际性组织的外交部长和知名人士,以及约四百名各国传媒
代表。
  • ^ 断言我们在开始。

  • [[:blank:][:digit:]]\+ POSIX 字符 class 匹配 \+ 一个或多个 [:blank:] 空格或 [:digit:] 数字.

  • 用空字符串替换那些匹配的字符将为您提供所需的输出

可以使用 Perl 完成这两个问题的完整解决方案:

$ perl -pe 's/\n//;s/^[\s\d]+/\n/a;' file

一项庄严肃穆富历史意义的仪式标志中华人民共和国对香港恢复行使主权。
英国皇储威尔斯亲王与中华人民共和国国家主席江泽民均在仪式上致辞,仪式於六月三十日午夜至七月一日凌晨举行,并向全世界直播。
仪式在香港会议展览中心新翼大厅举行,约四千名嘉宾出席,包括来自四十多个国家和国际性组织的外交部长和知名人士,以及约四百名各国传媒代表。

但有两个注意事项:

  1. 开头插入了一个空行。
  2. 最后的换行符已删除。

如果您能忍受这两个限制,那么上面的解决方案就可以了。它的工作方式如下:

  1. 首先,它从行尾删除换行符。
  2. 然后,如果该行以空格和数字序列开头(/a 修饰符使 \d\s 仅匹配 ASCII 数字和空格),将其替换为一个换行符。