给出一个数据文件tmp_file,
5 0 0 0
0 5 0 0
0 0 6 0
0 0 0 6
以下两个命令呈现的结果不同,为什么?
sed 's/\n/ /g' tmp_file
5 0 0 0
0 5 0 0
0 0 6 0
0 0 0 6
sed 's/0/ /g' tmp_file
5
5
6
6
编辑:
以前的帖子How can I replace a newline (\n) using sed?被建议解决了该问题。当然解决方案是相同的,但是在新手看来,这个问题看起来似乎有所不同。同样,不应期望任何人都能在数以百万计的帖子中找到正确的答案,即使像当前帖子一样进行了数小时的在线研究也是如此。如果由于与以前的帖子类似而给与否,我宁愿撤消该帖子。
答案 0 :(得分:1)
让我们尝试了解sed
如何读取Input_file,因此sed
通过分隔符读取行,分隔符本身就是新行。这意味着如果行与换行符分隔,则单行中不能再有新行,除非/除非我们确实让sed
知道要在循环中读取整个Input_file,然后替换新行(将值保留在保留sed
提供的开箱即用功能的空间,以将值保存在内存中以用于操作目的。这就是为什么您的第一个命令没有任何影响的原因,因为sed
找不到任何其中包含换行的行。
这是一个非常不错的线程(How can I replace a newline (\n) using sed?),我发现SO可以如下进行其解决方案及其解释(取自该线程)。
sed ':a;N;$!ba;s/\n/ /g' Input_file
上述代码的解释:
1-通过:a创建标签。
2-通过N将当前行和下一行添加到图案空间。
3-如果我们在最后一行之前,则跳转到创建的标签$!ba($!表示不要在最后一行上这样做,因为应该有最后一个换行符。)
4-最后,替换将每个换行符替换为模式空间上的空格(即整个文件)。
我想在上面添加我的解释,然后添加该线程的详细信息。