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结尾的单词的行。
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

你可能感兴趣的:(linux || sed(2))