【发布时间】:2011-02-24 07:49:03
【问题描述】:
我有一个文本文件(“INPUT.txt”),格式为:
A<LF>
B<LF>
C<LF>
D<LF>
X<LF>
Y<LF>
Z<LF>
<EOF>
我需要重新格式化为:
A:B:C:D:X:Y:Z<LF>
<EOF>
我知道你可以使用“sed”来做到这一点。使用“sed”进行此操作的谷歌点击量达到了 10 亿次。但我试图强调可读性、简单性以及使用正确的工具来完成正确的工作。 'sed' 是一个使用和隐藏换行符的行编辑器。可能不是适合这项工作的工具!
我认为这项工作的正确工具是“tr”。我可以使用以下命令将所有换行符替换为冒号:
cat INPUT.txt | tr '\n' ':'
我已经完成了 99% 的工作。不过,我现在有个问题。通过用冒号替换所有换行符,我不仅在序列末尾得到一个多余的冒号,而且在输入末尾也丢失了回车。它看起来像这样:
A:B:C:D:X:Y:Z:<EOF>
现在,我需要删除输入末尾的冒号。但是,如果我尝试通过“sed”传递这个处理过的输入以删除最后的冒号(我认为现在可以正确使用“sed”),我发现自己遇到了第二个问题。输入不再被换行符终止! 'sed' 对于所有命令都完全失败,因为它永远不会找到第一行输入的结尾!
似乎在某些输入的末尾添加换行符是一项非常非常常见的任务,并且考虑到我自己只是非常想用 C 编写一个程序来完成它(这需要大约八行代码) ,我无法想象没有一种非常简单的方法可以使用 Linux 内核中已经提供给您的工具来执行此操作。
【问题讨论】: