美文网首页
linux || sed(1)

linux || sed(1)

作者: 溪溪溪溪溪川 | 来源:发表于2019-03-22 14:51 被阅读0次

sed学习

sed [-hnV][-e<script>][-f<script文件>][文本文件]
sed [options] 'command' file(s)  #sed 后面接的动作,请务必以 '' 或者' 两个单引号括住喔!
sed [options] -f scriptfile file(s)

参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件
-n或--quiet或--silent 仅显示script处理后的结果。
-h或--help 显示帮助。
-V或--version 显示版本信息。

动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
g :表示行内全面替换

sed正则

命令 描述
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
(..) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/&/,love这成love。
< 匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
> 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。
注意:

-e : 可以在同一行里执行多条命令
不加 -e 只有 's/11/00/g' 进行了操作
具体参看sed 中-e与不加-e的区别

实例:
以行为单位的新增/删除
pengzw@super-server:~$ cat test.txt 
Hello,word!
Write a word!
I love dog!
Good good study, day day up!

pengzw@super-server:~$ sed '4a\newline' test.txt  #第四行后添加新的字符串
Hello,a!
Write a a!
I love dog!
Good good study, day day up!
newline
pengzw@super-server:~$ sed '4a newline' test.txt   #在第一行后面增加,同上的效果
Hello,a!
Write a a!
I love dog!
Good good study, day day up!
newline
pengzw@super-server:~$ nl test.txt |sed '2,4d' #删去2-4行
     1  Hello,a!
pengzw@super-server:~$ nl test.txt |sed '2,$d' #删去2之后的所有行,$匹配行结束
     1  Hello,a!
以行为单位的替换与显示

选定行的范围:,(逗号)

pengzw@super-server:~$ sed '2,3c No 2-3' test.txt  #取代2-3行为No 2-3 
Hello,a!
No 2-3
Good good study, day day up!
pengzw@super-server:~$ sed 's/word/a/' test.txt   #显示所有行,还是原来的test文件
Hello,a!
Write a a!
I love dog!
Good good study, day day up!
pengzw@super-server:~$ sed 's/word/a' test.txt  #a后面的/不能少,否则报错
sed: -e 表达式 #1, 字符 8: 未终止的“s”命令↵
pengzw@super-server:~$ sed -n 's/word/a/p' test.txt  #-n选项和p命令一起使用表示只打印那些发生替换的行:
Hello,a!
Write a a!
pengzw@super-server:~$ sed -n "1p;3,4p" test.txt  #打印1,3和4行,分号分割
Hello,word!
I love dog!
Good good study, day day up!
pengzw@super-server:~$ sed -e 's/,.*//g' test.txt  #将,后的全部替换。解释:这个就是替换命令,为空,格式为 s/.../.../g,最后的g表示全部替换,否则只替换第一次匹配的。

Hello
Write a word!
I love dog!
Good good study

定界符

以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符:定界符出现在样式内部时,需要进行转义

pengzw@super-server:~$ echo sksksksksksk | sed 's:sk:SK:4g'
skskskSKSKSK
-i 直接修改文件内容(危险动作)
pengzw@super-server:~$ sed -i 's/a/word/p' test.txt  #i会修改文件内容,并追加到文件
pengzw@super-server:~$ cat test.txt 
Hello,word!
Write word word!
Write word word!
I love dog!
Good good study, dwordy day up!
Good good study, dwordy day up!
pengzw@super-server:~$ sed -n -i 's/a/word/p' test.txt  # -n只显示改变的行
pengzw@super-server:~$ cat test.txt 
Write word word!
Good good study, dwordy day up!
多点编辑:e命令

-e选项允许在同一行里执行多条命令

pengzw@super-server:~$  sed -e '1d' -e 's/dog/cat/' test.txt
Write a word!
I love cat!
Good good study, day day up!
打印奇数偶数行
pengzw@super-server:~$ nl test.txt |sed -n 'p;n'
     1  Hello,word!
     3  I love dog!
pengzw@super-server:~$ nl test.txt |sed -n 'n;p'
     2  Write a word!
     4 Good good study, day day up!

方法2:

sed -n '1~2p' test.txt
sed -n '2~2p' test.txt

参考来源
https://blog.csdn.net/qqjtxc/article/details/79825283
https://www.cnblogs.com/maxincai/p/5146338.html
http://www.runoob.com/linux/linux-comm-sed.html

相关文章

网友评论

      本文标题:linux || sed(1)

      本文链接:https://www.haomeiwen.com/subject/asylvqtx.html