我有一个格式为的文本文件(“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 内核中已有的工具来完成此操作。
这应该可以完成工作(cat
and 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
Or:
awk '{printf colon $0; colon=":"} END {printf "\n" }' INPUT.TXT
Edit:
这是纯 Bash 中的另一种方式:
string=($(<INPUT.TXT))
saveIFS=$IFS
IFS=':'
newstring="${string[*]}"
IFS=$saveIFS
Edit 2:
这是另一种方法does use echo
:
echo "$(tr '\n' ':' < INPUT.TXT | head -c -1)"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)