[root@localhost135 ~]# cat sedtest
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]#
[root@localhost135 ~]# sed -n '3p' sedtest
alice is peter's wife. #只打印第三行
[root@localhost135 ~]#
[root@localhost135 ~]# sed -n '$p' sedtest
peter is alice's husband #只打印最后一行
[root@localhost135 ~]#
[root@localhost135 ~]# sed -n '2,3p' sedtest
Your name is peter.
alice is peter's wife. #只打印第二到第三行的内容,包含 第二第三 行
[root@localhost135 ~]#
[root@localhost135 ~]# sed '2,3d' sedtest #删除第二第三行,只打印出了第一和第四行
My name is alice.
peter is alice's husband
[root@localhost135 ~]# cat -n sedtest #查看原文件,内容仍然是完整的,所以sed不会对原文件产生影响
1 My name is alice.
2 Your name is peter.
3 alice is peter's wife.
4 peter is alice's husband
[root@localhost135 ~]# sed '/My/,/You/d' sedtest #删除包含 "My" 的行到包含"You"的行之间的行
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]# sed '/My/,3d' sedtest #删除包含"My"的行到第三行的内容
peter is alice's husband
[root@localhost135 ~]#
元字符 | 功能 | 示例 |
^ $ . * [ ] [^] \(..\) & \< \> x\{m\} x\{m,n\} x\{m,\} | 锚定行首 锚定行尾 匹配除换行符以外的单个字符 匹配零个或多个前导符号 匹配指定字符组内的任一字符 匹配不在指定字符组内的任一字符 保存已匹配的字符,后续用来引用该字符 保存查找串以便在替换中引用 词首定位符 词尾定位符 连续m个x 至少m个,但不超过n个x 至少m个x | /^my/ 匹配所有以my开头的行 /my$/ 匹配所有以my结尾的行 /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行 /my*/ 匹配包含字母m,后跟零个或者多个y字母的行 /[Mm]y/ 匹配包含My或my的行 /[^Mm]y/ 匹配包含y,但在y之前的那个字符不是M或者m的行 1,20s/\(you)self/\1r/ 标记元字符之间的模式,并将其保存为书签1,之后可以使用\1来引用它。 最多可以定义9个书签,从左边开始编号,最左边的是第一个。 此列中,对第1到20行进行处理,you被保存为书签1,如果发现youself,则替换为your. s/my/**&**/ 符号&代表查找串。my将被替换为 **my** /\<my/ 匹配包含以my开头的单词的行 /my\>/ 匹配包含以my结尾的单词的行 /9\{5\}/ 匹配包含连续5个9的行 /9\{5,7}/ 匹配包含连续5到7个9的行 /9\{5,\}/ 匹配包含至少连续5个9的行 |
[root@localhost135 ~]# sed '/My/p' sedtest # 在不加-n选项的情况下,默认把所有输入行全都打印出来
My name is alice. # 如果某行匹配模式My,p命令将把该行另外打印一遍
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]# sed -n '/My/p' sedtest # 添加-n选项,取消sed默认打印,p命令只把匹配模式My的行打印一遍
My name is alice.
[root@localhost135 ~]#
[root@localhost135 ~]# sed '$d' sedtest # 删除最后一行,其他的都被显示
My name is alice.
Your name is peter.
alice is peter's wife.
[root@localhost135 ~]# sed '/My/d' sedtest # 删除包含My的行,其他的都被显示
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]#
[root@localhost135 ~]# sed 's/My/You/g' sedtest # 命令末端的g表示在行内进行全局替换,也就是说如果某行多次出现My,所有的My都被替换成You
You name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]# sed -n '1,3s/wife.$/WIFF/gp' sedtest # 取消默认输出,处理1到3行里匹配以wife.结尾的行,把行内所有的wife.替换成WIFF,并打印到屏幕上。
alice is peter's WIFF
[root@localhost135 ~]# sed -n 's#peter#tom#gp' sedtest # 紧跟在s命令后的字符就是查找串和替换串之间的字符。默认是正斜杠/,但可以改变
Your name is tom. # 无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。
alice is tom's wife. # 示例中通过#作为分隔符,将peter替换成tom
tom is alice's husband
[root@localhost135 ~]#
[root@localhost135 ~]# sed -e '1,3d' -e 's/peter/tom/g' sedtest # 选项-e用于多重编辑
tom is alice's husband # 第一重编辑删除1-3行,第二重编辑将剩下的文本中所有出现peter替换成tom
[root@localhost135 ~]# # 是逐行进行编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果
[root@localhost135 ~]# cat rcmd.txt # 创建了一个名为rcmd.txt的文件,内容只有一个 hello
hello
[root@localhost135 ~]# sed '/is/r rcmd.txt' sedtest # 如果在文件sedtest的某一行匹配到了 is ,就在该行后面读入文件rcmd.txt里的内容
My name is alice. # 如果出现 is 的不止一行,则在出现 is 的各行后都读入rcmd.txt文件的内容
hello
Your name is peter.
hello
alice is peter's wife.
hello
peter is alice's husband
hello
[root@localhost135 ~]# # 示例中四行都有 is ,所以插入了四个hello
[root@localhost135 ~]# sed '/^peter/a\peter and alice are husband and wife' sedtest # 不换行追加
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
peter and alice are husband and wife # 追加的内容
[root@localhost135 ~]# sed '/^peter/a\ # 多行追加
> peter and alice are husband\
> and wife' sedtest
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
peter and alice are husband
and wife # 追加的内容
[root@localhost135 ~]#
[root@localhost135 ~]# sed '/^peter/i hello hello' sedtest # 在以peter开头的行的前面插入 hello hello
My name is alice.
Your name is peter.
alice is peter's wife.
hello hello
peter is alice's husband
[root@localhost135 ~]#
[root@localhost135 ~]# sed '/^peter/c\this is test' sedtest # 将以peter开头的行修改成 this is test
My name is alice.
Your name is peter.
alice is peter's wife.
this is test
[root@localhost135 ~]#
[root@localhost135 ~]# sed 'y/name/NAME/' sedtest # 将所有的小写 name 转换成大写 NAME
My NAME is AlicE.
Your NAME is pEtEr.
AlicE is pEtEr's wifE.
pEtEr is AlicE's husbANd
[root@localhost135 ~]#
[root@localhost135 ~]# sed -e '/peter/h' -e '$G' sedtest
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
peter is alice's husband
[root@localhost135 ~]# sed -e '/peter/H' -e '$G' sedtest
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]# sed -e '/peter/H' -e '$g' sedtest
My name is alice.
Your name is peter.
alice is peter's wife.
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]# sed -e '/peter/H' -e '$G' sedtest
My name is alice.
Your name is peter.
alice is peter's wife.
peter is alice's husband
Your name is peter.
alice is peter's wife.
peter is alice's husband
[root@localhost135 ~]#
[root@localhost135 ~]# cat sedtest.bash # 创建了一个名为sedtest.bash的脚本文件
#!/bin/bash
3i\
*****************
3,$s/\(peter\) is \(alice\)/\2 is \1/
$a\
We will love forever !!
[root@localhost135 ~]# sed -f sedtest.bash sedtest # 将此脚本文件应用到sedtest文本文件
My name is alice.
Your name is peter.
*****************
alice is peter's wife.
alice is peter's husband
We will love forever !!
[root@localhost135 ~]#