如何使用sed将多行内容合并为单行并以逗号分隔?
用sed实现多行转逗号分隔单行的方法
sed默认是逐行处理文本,每次只会把一行内容读入「模式空间」,并且会自动去掉行尾的换行符,所以你直接用s/\n/,/g找不到匹配项,而s/$/,/g也只能给每行末尾加逗号,没法合并成单行。
要实现把所有行合并为逗号分隔的单行,纯sed的解决方案可以用下面的命令:
sed ':a;N;$!ba;s/\n/,/g' test
命令解释:
:a:定义一个名为a的标签,用于跳转循环N:将下一行内容追加到当前模式空间,两行之间会保留换行符$!ba:如果当前行不是最后一行($!),就跳转到标签a继续执行,直到把所有行都读入模式空间s/\n/,/g:把模式空间里所有的换行符替换成逗号
执行后得到的结果是:
test1,test2,test3,test4,test5
如果想要和vi命令执行后一样,末尾也带逗号,可以调整命令为:
sed ':a;N;$!ba;s/\n/,/g;s/$/,/' test
执行结果:
test1,test2,test3,test4,test5,
另外也可以结合tr工具简化操作(虽非纯sed,但更直观):
sed 's/$/,/' test | tr -d '\n'
先用sed给每行加逗号,再用tr删掉所有换行符,同样能得到末尾带逗号的单行结果。
内容的提问来源于stack exchange,提问作者Classified
相关产品推荐
相关产品推荐

