小说 sed

看cu大神的sed帖子总结博客,如下,请大神们批评指教。

sed叫做流编辑器,也就是必须要有输入流,才能对文本进行编辑。

示例文本如下:cat  file

1  1

a  a

a,a  a,a

11=1c  11=1c

11c  11

aaa  aaad

1.s  1.sa

1、在每行的下面插入一个空行:

sed  ‘G’  file

2、在每行的上面插入一个空行:

sed ‘x;p;x’ file

3、经常会出现,每隔几行然后就取一次数据的情况。比如从第一行开始,每隔两行取一次数据。

sed -n ‘1~2p’ file

第一个的数字代表的是从第几行开始,后面的数字表示的每隔几行开始取文本。

4、给文本加上号码

如果是在awk中的话,显示行号会很简单,awk ‘{print NR,$0}’,在sed中这样子实现,sed = file | sed ‘N;s/\n/\t/’

解析:sed = filename是给每一行在上面插入一行,插入的一行是当前文章的行号。sed种的N的意思是将下一行接在上一行的后面,并且把回车换行符替换为tab符号。有没有什么疑问吗,既然是把下一行直接追加到上一行的后面,那岂不是所有的行都变成了一行了吗?其实不是这样子的,只有第一行和第二行,第三行和第四行才会这样子处理。

sed '1,$N;s/\n/\t/' file

1  1    a  a

a,a  a,a        11=1c  11=1c

11c  11 aaa  aaad

1.s  1.sa

这个是上面所示的结果。看明白了吧。

5、如果file中存在空行的话,并且空行不显示序号需要怎么办呢?

cat  file

1  1

a  a

a,a  a,a

 

11=1c  11=1c

 

11c  11

aaa  aaad

1.s  1.sa

处理

sed '/./=' file | sed '/./N;s/\n/\t/'

1       1  1

2       a  a

3       a,a  a,a

 

5       11=1c  11=1c

 

7       11c  11

8       aaa  aaad

9       1.s  1.sa

可以看到的是空行的序号虽然没有显示,但是存在了。因为非空行显示的序列号是不连续的。

6、sed中的模式匹配。

在处理文本的过程中,如果只是针对某些匹配的行进行处理,比如说只对拥有11字符串的行进行上面添加一个空行。

sed  ‘/11/{x;p;x}’ file

7、删除文件开头或者是结尾处的空格。

虽然是删除,但是用的命令仍然不是d,命令而是s命令,s命令的意思是替换的意思。删除空格的话,将空格改为空就可以。

sed -i 's/^[\t ]*//;s/[\t ]*$//'  file

此处是将tab键和空格键都替换为空。

8、使行整体偏移,向左偏移做个空格

sed ‘s/^/五个空格/’ file

9、利用括号可以选择匹配里面的东西,灵活进行输出和替换的控制。

cat file

a,hello fd fd fd f, dfdfd

fd df ,f 9fd  -pdf ,f df

如果想要输出的是两个逗号之间的内容

sed 's/\(.*\),\(.*\),\(.*\)/\2/' file

首先括号要用\\符号来包裹起来,后面的\2表示的是对第二个括号里面的内容进行引用。

10、模式匹配替换

sed  ‘s/a/b/’ file

sed  ‘/hello/s/a/b/’ file

把文件中出现hello的行中的第一次出现的a替换成为b

sed ‘/hello/!s/a/b/’

把文件中没有出现hello的行第一次出现的a替换成为b

11、多条件替换

sed ‘s///;s///;s///’ file

如果想进行多次替换。可以将多个替换的语句用逗号连接起来。

12、实现tac效果

首先要确定,执行到每一行,sed把当前处理的行存在临时的缓冲区内,

称为模式空间(pattern space).一旦sed完成对模式空间中行的处理,模式

空间中的行就被送往屏幕.行被处理完成后,就被移出模式空间...

 

命令执行第一行时,由于匹配了第一行,所以"!G"不起作用,只打印了

第一行的内容,然后"h"把模版块中的内容也就是第一行的内容拷贝进缓冲区,

注意此时是用第一行的内容替换空行.模式空间中的内容要打印,所以出现1.

执行到第二行时,打印第二行内容,而且由于不匹配"1",所以在后边"G"命令起

作用,获得了缓冲区中的第一行的内容,然后加到当前模式空间中,并打印,出现

21。然后把模式空间中的内容写入缓冲区,也就是把21写入缓冲区。执行到第三行

匹配不成功,所以缓冲区的内容应该是第二行的内容加上第一行的内容,追加到模

式空间的第三行后边:321.然后把321拷贝到缓冲区,...以此类推就出现了上

面的结果.

加上最后一句"$!d",那就是前面三行的结果删除,保留最后一行。这样就形成了

 tac的效果啦。

13、sed在指定的位置添加相应的字符串

sed 's/^/&hello/' file

在行手部之后添加hello字符串

&表示的是匹配的位置

sed ‘s/$/hello&/’ file

sed ‘s/a/&hello/’ file

在匹配到的a字符的后面添加hello字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值