首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接文件中的特定行

连接文件中的特定行
EN

Stack Overflow用户
提问于 2018-12-14 02:53:32
回答 1查看 44关注 0票数 2

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

代码语言:javascript
运行
复制
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列中,然后删除下一行。我之所以这样做,是因为我想忽略文件中以空格开头的其他行。结果应该如下所示:

代码语言:javascript
运行
复制
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

我最接近得到我想要的是:

代码语言:javascript
运行
复制
sed -i -r ':a;N;$!ba;s/[^A-Z]*\n([[:space:]])/\1/g' file.txt

我相信我已经得到了模式匹配,但是随后的替换确实弄乱了数字列的对齐。当我第一次开始的时候,这看起来像是一个简单的操作,但几个小时的搜索和实验并没有帮助。我对任何使用除了sed之外的其他东西的解决方案都持开放态度,但我更喜欢严格地使用bash。非常感谢!

EN

Stack Overflow用户

发布于 2018-12-14 17:09:07

这可能适用于您(GNU sed):

代码语言:javascript
运行
复制
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,并使用匹配和反向引用,从组合行中减去空格中第一行的长度。

打印这些行,然后将其删除。如果第二行不是以空格开头,那么通过使用PD命令,它不会被删除,而是通过sed脚本开头的regexp重新计算。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53768369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档