我有一个文本文件(下面的代码片段),其中包含一些公共领域的公司收益报告数据,格式如下:
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之外的其他东西的解决方案都持开放态度,但我更喜欢严格地使用bash。非常感谢!
发布于 2018-12-14 17:09:07
这可能适用于您(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。第二行被删除,第一行的内容变为空格。Processing现在交换回PS。将HS附加到PS,并使用匹配和反向引用,从组合行中减去空格中第一行的长度。
打印这些行,然后将其删除。如果第二行不是以空格开头,那么通过使用P和D命令,它不会被删除,而是通过sed脚本开头的regexp重新计算。
https://stackoverflow.com/questions/53768369
复制相似问题