sed流编辑器是shell中处理文本内容的一大利器。sed命令从文本流中读取一行文本到模式空间中进行相应的命令、或脚本处理,因此在处理换行符时会有点特殊。
下面的命令可以很正确的执行:
1
|
echo
"a,b,c,d"
|
sed
's/,/\n/g'
|
1
|
echo
"a,b,c,d"
|
sed
's/,/\n/g'
|
sed
's/\n/,/g'
|
1
|
echo
"a,b,c,d"
|
sed
's/,/\n/g'
|
tr
-t
'\n'
','
|
下面是网上找到的一些用法,经实践效果是各不相同的,只有一种是完全可行的。
1
|
sed
':label;N;s/\n/:/;b label'
filename
|
1
|
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的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符,而没有标签的话跳转的话,就只能每两行替换掉一个换行符,对比效果:
1
2
3
4
5
|
$
echo
"a,b,c,d"
|
sed
's/,/\n/g'
|
sed
':x;N;s/\n/,/;b x'
a,b,c,d
$
echo
"a,b,c,d"
|
sed
's/,/\n/g'
|
sed
'N;s/\n/,/'
a,b
c,d
|
1
2
3
4
5
|
$
echo
"a,b,c,d"
|
sed
's/,/\n/g'
|
sed
's/$/,/'
a,
b,
c,
d,
|
PS:sed中的n命令和~地址表示
1
|
sed
'8,80{n;n;n;d}'
filename
|
1
|
sed
'11~4d'
filename
|
该命令实现和上一个命令同样的功能,唯一的差别就是它直到文件结束,而无法指定结束行。
原文地址:http://my.oschina.net/shelllife/blog/118337