sed 替换所有的换行符,命令如下


echo -e "hello\nworld" | sed ':label;N;s/\n//g;b label'

  • :label; 定位标签,用来实现跳转处理,名字随便取(label),后面的b label就是跳转指令
  • N; N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,设定换行符可见
  • s/\n//g; s是sed的替换命令,将换行符替换为冒号
  • b label 或者 t label b / t 是跳转命令,跳转到指定标签

上述命令不支持在 Mac 上运行(暂时没找出原因)。下面这个可以,只是更复杂一点


echo -e "hello\nworld" | sed -n -e 'H;${x;s/\n//g;p;}'

-n 这个参数是必须的,去掉的话会输出每行的处理结果,当然,也可以通过不加这个参数,来看这行命令是怎么工作的
$ 表示最后一行
{...} 表示一个函数组
H; 将 pattern 空间的内容加到 hold 空间
x; 交换 pattern 空间和 hold 空间的内容
p; 将模式空间的内容输出到标准输出

这里涉及到了两个概念:模式空间(pattern space) 和 储存空间(hold space)。大概理解就是,sed 是一行一行处理文本的,模式空间用于临时存储每一行处理后的文本,在“处理”的过程中,可以通过 function 把模式空间的内容先存储到储存空间,上面的 H 就是干这个事的;之后又可以通过 x 等 function 把储存空间的东西移到模式空间里来继续处理。

这个命令的意思就是:

  • 首先通过 H 函数把一行的文本存储到储存空间;
  • $ 表示只有最后一行才执行接下来的 {...} 函数组,这样,每一行的内容就都去了储存空间;
  • 到了最后一行,开始执行函数组,首先通过 x 函数把储存空间的东西移到模式空间;
  • 通过 s/\n//g 这个替换函数把换行符替换掉;
  • 最后是 p 函数把模式空间的东西输出来,结束。

这个命令也可以在 Linux 上运行。