连接文件中的特定行

时间:2018-12-13 18:53:32

标签: sed text-processing

我有一个文本文件(下面的摘录),其中包含一些公共领域的公司收益报告数据,格式如下:

Current assets:
Cash and cash equivalents
                                  $ 21,514       $ 21,120
Short-term marketable securities
                                    33,769         20,481
Accounts receivable
                                    12,229         16,849
Inventories
                                     2,281          2,349

,而我要执行的操作(使用sed)如下:如果当前行以大写字母开头,而下一行以空格开头,则将下一行的最后N个字符复制到最后的N个字符中当前行的列,然后删除下一行。我这样做是因为文件中还有其他以空白开头的行我想忽略。结果应如下所示:

Current assets:
Cash and cash equivalents         $ 21,514       $ 21,120
Short-term marketable securities    33,769         20,481
Accounts receivable                 12,229         16,849
Inventories                          2,281          2,349

我最想要得到的是:

sed -i -r ':a;N;$!ba;s/[^A-Z]*\n([[:space:]])/\1/g' file.txt

,我相信我的模式可以匹配,但是随后的替换确实弄乱了数字列的对齐方式。当我刚开始时,这似乎是一个简单的操作,但是数小时的搜索和试验却无济于事。我对使用除sed以外的其他功能的任何解决方案持开放态度,但更希望严格控制它。非常感谢!

1 个答案:

答案 0 :(得分:0)

这可能对您有用(GNU sed):

sed -r '/^[[:upper:]]/{N;/\n\s/{h;x;s/\n.*//;s/./ /g;x;G;s/(\n *)(.*)\1$/\2/};P;D}' file

此解决方案仅处理两个连续的行,分别以大写字母和空格开头。所有其他行均按原样打印。

将以上两行收集到图案空间(PS)中之后,就制作了一个副本并将其存储在保存空间(HS)中。现在处理交换到HS。第二行被删除,第一行的内容变为空格。现在,处理将交换回PS。 HS附加到PS,并使用匹配和反向引用从合并的行中减去空格中第一行的长度。

打印该行,然后将其删除。如果第二行不是以空格开头,则使用PD命令,它不会被删除,而是会在sed脚本开始时通过regexp进行重新评估。 / p>

相关问题