使用linux重新格式化butchered文本

时间:2015-01-15 06:50:06

标签: regex linux sed

我有一些格式如下的文字:

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

这是超大型文档的一部分。

我想要做的是在句子开头之前删除所有内容,即所有空格和行号,同时使句子完整无缺。

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

另一个挑战是,有些线条被拆开并向下移动到较低的线条,这是有问题的,理想情况下我想将这些组件重新附加到它们来自的句子,即直接在它们上面的句子。这可以通过上例中的最后一句来举例说明。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

  • [[:blank:][:digit:]]\+ POSIX字符类,匹配\+[:blank:]个空格或[:digit:]个数字。

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

答案 1 :(得分:1)

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

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

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

但有两点需要注意:

  1. 在开头插入一个空行。
  2. 删除了最终换行符。
  3. 如果你能忍受这两个限制,那么上面的解决方案就可以了。它的工作方式如下:

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