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 上运行。