我有一个文本文件(下面的摘录),其中包含一些公共领域的公司收益报告数据,格式如下:
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以外的其他功能的任何解决方案持开放态度,但更希望严格控制它。非常感谢!
答案 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,并使用匹配和反向引用从合并的行中减去空格中第一行的长度。
打印该行,然后将其删除。如果第二行不是以空格开头,则使用P
和D
命令,它不会被删除,而是会在sed脚本开始时通过regexp进行重新评估。 / p>