我有一个文本文件("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‘来做这件事,谷歌有十亿的点击量。但我正在努力强调可读性、简单性和使用正确的工具来完成正确的工作。‘'sed’是一个使用和隐藏换行符的行编辑器。可能不是适合这项工作的工具!
我认为这个工作的正确工具应该是'tr‘。我可以用下面的命令用冒号替换所有换行符:
cat INPUT.txt | tr '\n' ':'
我已经完成了99%的工作。不过,我现在有个问题。通过用冒号替换所有换行符,我不仅在序列的末尾得到了一个无关的冒号,而且还丢失了输入末尾的回车。它看起来是这样的:
A:B:C:D:X:Y:Z:<EOF>
现在,我需要删除输入末尾的冒号。但是,如果我试图通过'sed‘传递这个经过处理的输入来删除最后一个冒号(我认为这是’sed‘的正确用法),我会发现自己遇到了第二个问题。输入不再以换行符结束!对于所有命令,‘'sed’都会彻底失败,因为它永远不会找到第一行输入的末尾!
在一些输入的末尾加一个换行符似乎是一个非常、非常常见的任务,考虑到我自己非常想用C语言编写一个程序来做这件事(这将需要大约八行代码),我无法想象在Linux内核中已经有一个非常简单的方法来做这件事。
发布于 2010-05-27 01:39:13
这应该可以完成工作(不需要使用cat
和echo
):
tr '\n' ':' < INPUT.TXT | sed 's/:$/\n/'
仅使用sed
sed -n ':a; $ ! {N;ba}; s/\n/:/g;p' INPUT.TXT
不带任何外部设备的Bash:
string=($(<INPUT.TXT))
string=${string[@]/%/:}
string=${string//: /:}
string=${string%*:}
在sh
中使用循环
colon=''
while read -r line
do
string=$string$colon$line
colon=':'
done < INPUT.TXT
使用AWK:
awk '{a=a colon $0; colon=":"} END {print a}' INPUT.TXT
或者:
awk '{printf colon $0; colon=":"} END {printf "\n" }' INPUT.TXT
编辑:
这是纯Bash的另一种方式:
string=($(<INPUT.TXT))
saveIFS=$IFS
IFS=':'
newstring="${string[*]}"
IFS=$saveIFS
编辑2:
下面是使用echo
的另一种方式
echo "$(tr '\n' ':' < INPUT.TXT | head -c -1)"
发布于 2012-06-23 02:13:41
老问题,但是
paste -sd: INPUT.txt
https://stackoverflow.com/questions/2915556
复制