sed 去掉所有的换行符
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 labelb / 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 上运行。