如何将文本文件的每两行与Bash配对?
通过一个简单的bash脚本,我生成了一个包含许多行的文本文件,如下所示:如何将文本文件的每两行与Bash配对?,bash,sed,text-files,Bash,Sed,Text Files,通过一个简单的bash脚本,我生成了一个包含许多行的文本文件,如下所示: 192.168.1.1 主机名1 192.168.1.2 主机名2 192.168.1.3 主机名3 现在我想重新格式化此文件,使其看起来像这样: 192.168.1.1主机名1 192.168.1.2主机名2 192.168.1.3主机名3 我将如何以这种方式重新格式化它?也许sed?这里有一个纯shell的替代方案: $ sed '$!N;s/\n/ /' infile 192.168.1.1 hostname1
192.168.1.1
主机名1
192.168.1.2
主机名2
192.168.1.3
主机名3
现在我想重新格式化此文件,使其看起来像这样:
192.168.1.1主机名1
192.168.1.2主机名2
192.168.1.3主机名3
我将如何以这种方式重新格式化它?也许
sed
?这里有一个纯shell的替代方案:
$ sed '$!N;s/\n/ /' infile
192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3
while read first; do read second; echo "$first $second"; done
我喜欢这个解决方案的简单性
cat infile | paste -sd ' \n'
192.168.1.1 hostname1
192.168.1.2 hostname2
192.168.1.3 hostname3
或者用逗号分隔,而不是用空格分隔
cat infile | paste -sd ',\n'
如果你的输入文件有第三行,比如时间戳
192.168.1.1
hostname1
14423289909
192.168.1.2
hostname2
14423289910
192.168.1.3
hostname3
14423289911
那么唯一的改变就是在分隔符列表中添加另一个空格
cat infile | paste -sd ' \n'
192.168.1.1 hostname1 14423289909
192.168.1.2 hostname2 14423289910
192.168.1.3 hostname3 14423289911
为什么不以理想的格式开始生成文件?请解释一下它是如何产生的?@NawaMan:如果你的意思是“它是如何工作的?”那么:如果不是(!)最后一行($),然后附加下一行(N),并用空格(s/\N//)替换它们之间的换行符,然后从下一行开始重复(这将是第三、第五行,等等。)但是你应该使用
-r
标志和read
。done
行是否需要done
?如果行本身有空格怎么办?@MihaiDanila刚刚尝试过,没有任何变化。