方法一:

# echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n/,/g'

1,2,3,4

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

这将在一个循环里读取整个文件,然后将换行符替换成逗号。

说明:

  1. 通过 :a创建一个标记

  2. 通过N追加当前行和下一行到模式区域

  3. 如果处于最后一行前,跳转到之前的标记处。 $!ba ($! 意思是不在最后一行做这操作 (最后一行就被当成最后的一行).

  4. 最后置换操作把模式区域(就是整个文件)的每一个换行符换成逗号。

From: http://stackoverflow.com/questions/1251999/sed-how-can-i-replace-a-newline-n


方法二:

sed ':label;N;s/\n/:/;b label' filename

sed ':label;N;s/\n/:/;t label' filename

上面的两条命令可以实现将文件中的所有换行符替换为指定的字串,如命令中的冒号。命令的解释:

:label;  这是一个标签,用来实现跳转处理,名字可以随便取(label),后面的b label就是跳转指令

N;  N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见

s/\n/:/;   s是sed的替换命令,将换行符替换为冒号

b label  或者 t label    b / t 是sed的跳转命令,跳转到指定的标签处

标签跳转和N的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符,对比效果:


$  echo "1,2,3,4" |sed 's/,/\n/g'|sed ':x;N;s/\n/,/;b x'

1,2,3,4

$  echo "a,b,c,d" |sed 's/,/\n/g'|sed 'N;s/\n/,/'

1,2

3,4


方法三:

# sed  '{1h;1!H;$!d;$x;${s/\n/\//g}}'  filename