Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将文本文件的每两行与Bash配对?_Bash_Sed_Text Files - Fatal编程技术网

如何将文本文件的每两行与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

通过一个简单的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.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刚刚尝试过,没有任何变化。