sed对待换行符和常规字符是否相同?

时间:2018-11-18 02:41:46

标签: search sed replace newline

给出一个数据文件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?被建议解决了该问题。当然解决方案是相同的,但是在新手看来,这个问题看起来似乎有所不同。同样,不应期望任何人都能在数以百万计的帖子中找到正确的答案,即使像当前帖子一样进行了数小时的在线研究也是如此。如果由于与以前的帖子类似而给与否,我宁愿撤消该帖子。

1 个答案:

答案 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-最后,替换将每个换行符替换为模式空间上的空格(即整个文件)。

我想在上面添加我的解释,然后添加该线程的详细信息。