【问题标题】:does sed treat newline and regular character identically?sed 是否同样对待换行符和常规字符?
【发布时间】:2019-04-20 19:07:20
【问题描述】:

给定一个数据文件 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? 建议已解决该问题。当然,解决方案是相同的,但问题在新手眼中看起来似乎不同。此外,人们不应该期望任何人能够在数以百万计的帖子中找到正确的答案,即使在当前帖子中进行了数小时的在线研究。如果因为与之前的帖子相似而被打负分,我宁愿撤回帖子。

【问题讨论】:

标签: search sed replace newline


【解决方案1】:

让我们试着了解sed 是如何读取Input_file 的,所以sed 是通过分隔符读取行,它本身就是新行。这意味着如果行与新行分隔,则单行不能有新行,直到/除非我们确实让sed 知道在循环中读取整个 Input_file 然后替换新行(将值保留在保持空间中这是sed 提供的开箱即用功能,用于将值保存在内存中以供操作使用)。这就是为什么你的第一个命令没有任何影响,因为sed 没有找到任何包含新行的行。

这是我发现的非常好的线程(How can I replace a newline (\n) using sed?),您可以通过它的解决方案及其解释(取自该线程)如下。

sed ':a;N;$!ba;s/\n/ /g' Input_file

以上代码说明:

1-通过 :a 创建标签。

2- 通过 N 将当前行和下一行附加到模式空间。

3- 如果我们在最后一行之前,则跳转到创建的标签 $!ba($! 表示不在最后一行执行此操作,因为应该有一个最后的换行符)。

4- 最后,替换用模式空间(即整个文件)上的空格替换每个换行符。

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

【讨论】:

  • 非常感谢您的解释。现在我懂了!所以确实 \n 和其他字符(常规或特殊)是不同的。基本上,您说我需要读取整个输入文件才能用空格替换 \n 。顺便说一句,N 可能是指仅将下一行附加到模式缓冲区而不是包括当前行,否则,每次进程分支时,当前行将被读入两次。是吗?
猜你喜欢
  • 2011-10-07
  • 1970-01-01
  • 2019-02-14
  • 2016-03-09
  • 2013-11-14
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多