看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字符串