linux || sed(2)
调用sed有三种方式:
- 在命令行键入命令;
- 将sed命令插入脚本文件,然后调用sed;
- 将sed命令插入脚本文件,并使sed脚本可执行。
1.使用sed命令行格式为:
sed [options] sed命令 输入文件
记住在命令行使用sed命令时,实际命令要加单引号。sed也允许加双引号。
2.使用sed脚本文件,格式为:
sed [options] -f sed脚本文件 输入文件
3.要使用第一行具有sed命令解释器的sed脚本文件,其格式为:
sed脚本文件 [options] 输入文件
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中
接受输入,一般是键盘或重定向结果。
sed options如下:
- n 不打印;sed不写编辑行到标准输出,缺省为打印所有行(编辑和未编辑)。p命令可以用来打印编辑行。
- e∶进行多项编辑,即对输入行应用多条sed命令时使用. 直接在指令列模式上进行 sed 的动作编辑
- c 下一命令是编辑命令。使用多项编辑时加入此选项。如果只用到一条sed命令,此选项无用,但指定它也没有关系。
- f 如果正在调用sed脚本文件,使用此选项。
- i∶直接修改读取的文件内容,而不是由屏幕输出
1.使用sed在文件中查询文本的方式
sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1)使用行号,可以是一个简单数字,或是一个行号范围。
2 ) 使用正则表达式
使用sed定位文本的一些方式
命令 | 描述 |
---|---|
x | x为一行号,如1 |
x , y | 表示行号范围从x到y,如2,5表示从第2行到第5行 |
/pattern/ | 查询包含模式的行。例如/disk/或/[a-z]/ |
/pattern/pattern/ | 查询包含两个模式的行。例如/disk/disks/ |
/pattern/,x | 在给定行号上查询包含模式的行。如/ ibbon/ , 3 |
x , /pattern/ | 通过行号和模式查询匹配行。3,/vdu/ |
x , y ! | 查询不包含指定行号x和y的行。1 , 2 ! |
2.基本sed编辑命令
sed编辑命令
命令 | 描述 |
---|---|
p | 打印匹配行 |
= | 显示文件行号 |
a \ | 在定位行号后附加新文本信息 |
i \ | 在定位行号后插入新文本信息 |
d | 删除定位行 |
c \ | 用新文本替换定位文本 |
s | 使用替换模式替换相应模式 |
r | 从另一个文件中读文本 |
w | 写文本到一个文件 |
q | 第一个模式匹配完成后推出或立即推出 |
l | 显示与八进制ASCII代码等价的控制字符 |
{ } | 在定位行执行的命令组 |
n | 从另一个文件中读文本下一行,并附加在下一行 |
g | 将模式2粘贴到/pattern n/ |
y | 传送字符 |
n | 延续到下一输入行;允许跨行的模式匹配语句 |
3.sed和正则表达式
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的行。 |
4.基本sed使用举例(都是要test.txt文件)
1)使用p(rint)显示行
ptint命令格式为[ address [,address ] P。显示文本行必须提供sed命令行号。
pengzw@super-server:~$ cat test.txt
Hello,world!
Write a word!
I love dog!
Good good study, day day up!
I have $1.
pengzw@super-server:~$ sed -n '2p' test.txt
Write a word!
2)打印范围:可以指定行的范围,现打印1到3行,用逗号分隔行号。
pengzw@super-server:~$ sed -n '1,2p' test.txt
Hello,world!
Write a word!
3)打印模式:匹配单词day,并打印此行,使用模式/pattren/
pengzw@super-server:~$ sed -n '/day/'p test.txt
Good good study, day day up!
4)使用模式和行号进行查询:4 , /the/,但是有一个问题,如果行号指定不对,会出现指定行和匹配day的行。
pengzw@super-server:~$ sed -n '4,/day/'p test.txt
Good good study, day day up!
pengzw@super-server:~$ sed -n '3,/day/'p test.txt
I love dog!
Good good study, day day up!
5)匹配元字符
匹配元字符$前,必须使用反斜线\屏蔽其特殊含义。模式为/$/ p。
pengzw@super-server:~$ sed -n '/\$/'p test.txt
I have $1.
6)显示整个文件:1,$p,$意为最后一行。
pengzw@super-server:~$ sed -n '1,$p' test.txt
Hello,world!
Write a word!
I love dog!
Good good study, day day up!
I have $1.
7)任意字符:
pengzw@super-server:~$ sed -n '/.*u/'p test.txt
Good good study, day day up!
8)首行:比较两种写法,一般都是第二种
pengzw@super-server:~$ sed -n '1'p test.txt
Hello,world!
pengzw@super-server:~$ sed -n '1p' test.txt
Hello,world!
9)末行
pengzw@super-server:~$ sed -n '$p' test.txt
I have $1.
10)打印行号
要打印行号,使用等号=。打印模式匹配的行号,使用格式/pattern/ =。
整个文件都打印出来,并且匹配行打印了行号。
pengzw@super-server:~$ sed -e '/.u/=' test.txt
Hello,world!
Write a word!
I love dog!
4
Good good study, day day up!
I have $1.
如果只关心实际行号,使用-n选项。
pengzw@super-server:~$ sed -n '/.u/=' test.txt
4
如果只打印行号及匹配行,必须使用两个sed命令,并使用e选项。第一个命令打印模式
匹配行,第二个使用=选项打印行号,格式为sed -n -e /pattern/p -e /pattern/=。
pengzw@super-server:~$ sed -n -e '/u/p' -e '/u/=' test.txt
Good good study, day day up!
4
参考:
linux与unix shell编程指南.pdf
https://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html