文档章节

sed命令替换换行符

水海云
 水海云
发布于 2013/03/28 20:19
字数 771
阅读 24915
收藏 19

sed流编辑器是shell中处理文本内容的一大利器。sed命令从文本流中读取一行文本到模式空间中进行相应的命令、或脚本处理,因此在处理换行符时会有点特殊。

下面的命令可以很正确的执行:

echo "a,b,c,d" |sed 's/,/\n/g'
但是如果我想恢复回来,下面的命令却没有效果了:
echo "a,b,c,d" |sed 's/,/\n/g'|sed 's/\n/,/g'
这跟sed的行处理方式有关,sed读取一行时,会先把换行符去掉,处理完后再添加上,所以是无法使用上面的命令进行换行符替换的,必须使用sed中的其它命令来完成。上面的恢复可以使用tr命令:
echo "a,b,c,d" |sed 's/,/\n/g'|tr -t '\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 "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
还有如下的一种命令的处理效果,也是无法实现换行符的替换。事实上$符号在sed中表示文本流中的最后一行,下面的处理结果我并不是很理解。
$  echo "a,b,c,d" |sed 's/,/\n/g'|sed 's/$/,/'
a,
b,
c,
d,

PS:sed中的n命令和~地址表示

sed '8,80{n;n;n;d}' filename
n表示读取文本流中的下一行到模式空间(N为追加),sed还是只处理一行。上面的命令理解:从第8行起(包含),一次读取9/10/11行,然后读取11行后,执行d命令,就是删除处理空间中的第11行,之后从12行开始,读取13/14/15, 删除15行,以此类推,直到第80行。
sed '11~4d' filename
该命令实现和上一个命令同样的功能,唯一的差别就是它直到文件结束,而无法指定结束行。

© 著作权归作者所有

共有 人打赏支持
水海云
粉丝 50
博文 120
码字总数 101938
作品 0
深圳
程序员
加载中

评论(2)

LionelShen
LionelShen
挺好
韦不良
韦不良
不错哦
大数据教程(2.9):Linux命令sed详解

Sed简介 sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲...

em_aaron
07/14
0
0
Linux学习----文本三剑客——sed(马哥教育原创)

来源:马哥教育 我以前的文章介绍过grep了,今天我就来说一下第二个sed,它是stream editor的缩写。在Linux的文本文件中文本存储都是一行,显示时表现的多行其实都是因为有换行符的存在,例如...

Py爱好
08/02
0
0
Linux学习-10月17(sed)

9.4/9.5 sed 一、sed命令 sed命令主要用于删除、查找替换 sed的用法: sed命令模式:sed [option] 'sed命令' filename sed脚本模式:sed [option] 'sed script' filename sed选项: -n:只打印...

wxy丶
昨天
0
0
【Linux】sed命令用法详解

http://witmax.cn/linux-sed-usage.html http://www.linuxsir.org/bbs/showthread.php?t=189620 Sed学习笔记 1. sed简介 sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行...

AlphaJay
2011/11/10
0
0
Sed、Awk和grep 学习笔记(一)

一 Sed 命令 命令格式: sed [-nefi] '[动作]' [filename] 参数: -n 安静模式,只显示sed处理的那一行。 -e 多重编辑,可以同时执行多个动作。sed -e '1d' -e '1a ttt' -f 将sed动作写入脚本,...

yw天天向上
07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
1
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
19
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
1
0
emoji

前言:随着iOS系统版本的升级,对原生emoji表情的支持也越来越丰富。emoji表情是unicode码中为表情符号设计的一组编码,当然,还有独立于unicode的另一套编码SBUnicode,在OS系统中,这两种编...

HeroHY
昨天
2
0
rabbitmq学习(二)

生产者消费者初级案列 ChannelUtils package com.hensemlee.rabbitmq;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.Connecti......

hensemlee
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部