0. 场景
$ cat test_1.txt
##Peppa_Pig
#name
Peppa 6
George 3
Susy 6
有一批文件,格式同上,现在需要在第二行加上"age"字符串,并与前一个字段用制表符"\t"分隔。
1. awk
awk其实很好实现
$ awk '{if($0 ~ /^#name/) print $0"\tage"}{if($0 !~ /^#name/) print $0}' test.txt
##Peppa_Pig
#name age
Peppa 6
George 3
Susy 6
2. sed
$ sed '2a ###age' test.txt
##Peppa_Pig
#name
###age
Peppa 6
George 3
Susy 6
$ sed '2a ###age' test.txt | sed 's/\n###/\t/g'
##Peppa_Pig
#name
###age
Peppa 6
George 3
Susy 6
这里3个#
的作用是保证唯一性,具体是什么符号不重要。可以看出来,第二个替换没有成功,原因就是含有\n
。这和sed的作用原理有关,sed处理文本的步骤是:通过\n
识别多行文本的每一行,去掉\n
,做处理,添加\n
,输出。在做处理的时候,已经没有\n
了。
如果在处理的时候,\n
仍然存在,并且是对整个文本文件处理(不是一行一行,能跨行),这个问题就解决了。
$ sed '2a ###age' test.txt | sed ':label;N;s/\n###/\t/;b label'
##Peppa_Pig
#name age
Peppa 6
George 3
Susy 6
:label;表示一个标签,结合后面的b label(跳转指令)实现
跳转
N;表示追加
文本流中的下一行
到模式空间
进行合并处理
b label或者t label表示sed的跳转命令,跳转到指定的标签处label的作用类似C语言中的goto,先定义一个标签,然后在其他地方可以goto到标签代码的地方重新执行
3. tr
tr只能实现单个字符的替换
参考
https://my.oschina.net/shelllife/blog/118337
https://blog.csdn.net/napolunyishi/article/details/22185673
http://www.bubuko.com/infodetail-1655818.html
网友评论