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
网友评论