方法一:
# echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n/,/g'
1,2,3,4
sed ':a;N;$!ba;s/\n/,/g'
这将在一个循环里读取整个文件,然后将换行符替换成逗号。
说明:
通过
:a
创建一个标记通过N追加当前行和下一行到模式区域
如果处于最后一行前,跳转到之前的标记处。
$!ba
($!
意思是不在最后一行做这操作 (最后一行就被当成最后的一行).最后置换操作把模式区域(就是整个文件)的每一个换行符换成逗号。
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