Linux Sed命令学习笔记

1 功能说明

sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或者加入i参数。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

小结:sed的功能是,对字符串进行增加、删除、改变、查找,即增删改查!

2 语法格式

sed [optian] [sed-command] [input-file]

 

  • 注意sed和后面的选项之间至少有一个空格。
  • 为了避免混淆,称呼sed为sed软件。sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令。
  • sed-commands既可以是单个sed命令,也可以是多个sed命令组合。
  • input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。

3 常用选项

测试文本内容为:

[[email protected] ~]# cat oldboy.txt
I am oldboy teacher!
I teach linux.
 
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
 
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
gd
good
gooood
[[email protected] ~]#

3.1 取消标准输出

-n:表示取消标准输出(默认情况下sed替换后会把文件所有内容包括更改过的内容一起输出到屏幕上,我们使用-n后,让它只输出匹配表达式的字符串,一般和p连用,p表示print,打印表达式结果)。

[[email protected] ~]# sed ‘/old/p‘ oldboy.txt   
I am oldboy teacher!
I am oldboy teacher!
I teach linux.
 
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
 
not4900000448.
my god ,iam not oldbey,but OLDBOY!
my god ,iam not oldbey,but OLDBOY!
gd
good
gooood
[[email protected]~]# sed  -n ‘/old/p‘ oldboy.txt
I amoldboy teacher!
my blogis http://oldboy.blog.51cto.com
my god ,iam not oldbey,but OLDBOY!
[[email protected]~]#     //-n和p连用后表示只打印符合表达式规则的行

3.2 支持扩展正则表达式

-r:参数用来支持扩展正则表达式,比如{}符号,如果不加-r参数需要使用\来进行转意。

[[email protected] ~]# sed -n ‘/o\{1,2\}/p‘ oldboy.txt
I am oldboy teacher!
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
good
gooood
[[email protected] ~]# sed -nr ‘/o{1,2}/p‘ oldboy.txt   
I am oldboy teacher!
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
good
gooood
[[email protected] ~]# //表达式含义:o最少重复1次,最多重复2次

3.3 直接修改文件内容

-i:表示直接对目标文件进行操作(增删改查),加上这个参数之后,不会在屏幕上输出信息,会直接对源文件进行更改(慎用)。

[[email protected] ~]# sed -i ‘/^$/d‘ oldboy.txt  //直接删除文件内的空行,并没有打印。
[[email protected] ~]# cat oldboy.txt        
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinesechess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
gd
good
gooood
[[email protected] ~]#

4 sed-command

测试文本内容为:

[[email protected] ~]# cat study.txt
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#

4.1 增加

-i:表示插入,插入到目标行之前。

[[email protected] ~]# sed ‘2i she is a girl‘ study.txt
1,I am a Linux student
she is a girl
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#   //2i表示在第二行插入,不加行号表示在每一行之前插入

-a:表示在目标行之后添加

[[email protected] ~]# sed  ‘3a he is a boy‘ study.txt 
1,I am a Linux student
2,I am studying Linux
3,I like movice
he is a boy
4,I am super man
5,I like computer games
[[email protected] ~]#

多行增加

方法一:利用\n,表示换行符

[[email protected] ~]# sed ‘2i 1\n2\n3‘ study.txt
1,I am a Linux student
1
2
3
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#

方法二:利用shell特性(\回车)表示接着下一行。

[[email protected] ~]# sed ‘2i 1> 2> 3 ‘ study.txt
1,I am a Linux student
1
2
3
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#

4.1.1 限定区域添加

sed软件可以对单行或多行进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行。

用法:

n1[,n2]{sed-commands}

注:地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。

例子:

n{sed-commands}        对第n行操作。

[[email protected] ~]# sed ‘5c she is a girl ‘ study.txt
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
she is a girl
[[email protected] ~]#     //表示针对第武行进行替换,替换为she isa girl

n,m{sed-commands}     对n到m行操作,包括第n,m行。

[[email protected] ~]# sed ‘2,4c she is a girl ‘ study.txt
1,I am a Linux student
she is a girl
5,I like computer games
[[email protected] ~]#     //表示把2到4行替换成she is a girl。

n,+m{sed-commands}   对n到n+m行操作,包括第n,m行

[[email protected] ~]# sed ‘2,3d‘ study.txt
1,I am a Linux student
4,I am super man
5,I like computer games
[[email protected] ~]#         //表示2到3行删除

1~2{sed-commands}       对1,3,5,7,……行操作

[[email protected] ~]# sed ‘2~2d‘ study.txt 
1,I am a Linux student
3,I like movice
5,I like computer games
[[email protected] ~]#         //表示对2,4,6,8等偶数行进行操作

n,${sed-commands}     对n到最后一行($代表最后一行)操作,包括第n行

[[email protected] ~]# sed ‘2,$d‘ study.txt
1,I am a Linux student
[[email protected] ~]#         //删除2行到$(尾行)

/Linux/{sed-commands}         对匹配oldboy的行操作

[[email protected] ~]# sed ‘/Linux/d‘ study.txt
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#     //表示把包涵Linux的行删掉

/Linux/,/movice/{sed-commands}  对匹配oldboy的行到匹配Alex的行操作

[[email protected] ~]# sed ‘/Linux/,/movice/d‘study.txt 
4,I am super man
5,I like computer games
[[email protected] ~]#         //表示把第一个包涵Linux到第一个包涵movice的行删掉

/movice/,${sed-commands}       对匹配oldboy的行到最后一行操作

[[email protected] ~]# sed ‘/movice/,$d‘ study.txt
1,I am a Linux student
2,I am studying Linux
[[email protected] ~]#         //表示从movice到最后一行删掉

/games/,10{sed-commands}      对匹配oldboy的行到第10行操作,注意:如果前10行没有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的所有行,如果有。

[[email protected] ~]# sed ‘/games/,4d‘ study.txt   
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
[[email protected] ~]#

1,/am/{sed-commands}         对第1行到匹配Alex的行操作

[[email protected] ~]# sed ‘1,/am/d‘ study.txt
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#      //表示从1行到第一个匹配到am的行删除

/student/,+2{sed-commands}      对匹配oldboy的行到其后的2行操作

[[email protected] ~]# sed ‘/student/,+2d‘ study.txt
4,I am super man
5,I like computer games
[[email protected] ~]#         //表示从匹配student的第一项到它的后两行进行删除

4.2 删除

-d:表示删除,可以直接删除行,可以删除包涵关键字的行

[[email protected] ~]# sed ‘2d‘ study.txt
1,I am a Linux student
3,I like movice
4,I am super man
5,I like computer games
games                         //删除第2行
[[email protected] ~]# sed ‘/am/d‘ study.txt
3,I like movice
[[email protected] ~]#                //删除包涵am的行

4.3 查找

p表示打印,把符合我们表达式的项目打印出来,由于sed默认输出所有,再使用拍的话会打印两遍,所以一般和-n参数连用,表示只打印匹配到的行。

[[email protected] ~]# sed ‘/am/p‘ study.txt  //由于没有-n所以会把匹配到的行和默认输出一起打印
1,I am a Linux student
1,I am a Linux student
2,I am studying Linux
2,I am studying Linux
3,I like movice
4,I am super man
4,I am super man
5,I like computer games
5,I like computer games
games
games
[[email protected] ~]# sed -n ‘/am/p‘ study.txt    //-n取消默认输出,p打印,所以只显示匹配项
1,I am a Linux student
2,I am studying Linux
4,I am super man
5,I like computer games
games
[[email protected] ~]#
[[email protected] ~]# sed -n ‘2p‘ study.txt
2,I am studying Linux
[[email protected] ~]#          //只显示第二行

4.4 改

-c:按行替换,表示一次替换一整行的内容。

[[email protected] ~]# sed ‘1c she is a girl‘ study.txt
she is a girl
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
games
[[email protected] ~]#       //表示把第1行,替换成she is a girl

4.4.1 文本替换

s:表示全局查找某个关键字,并替换每行第一个匹配项。

g:表示全局替换,不属于sed命令,一般搭配s使用。

格式:

     sed  ‘s#1#2#g’

  • #:表示定界符,可以是/、@、或者其他成对符号。
  • 1:表示要替换的源文件中的字符串(可以是正则表达式)。
  • 2:表示要替换成的文件,必须是给定的字符串。

文本替换实例:

[[email protected]~]# !ca
cat study.txt
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]# sed ‘1s#a#b#‘ study.txt     //把第一个a替换为b
1,I bm a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#
[[email protected] ~]# sed ‘1s#a#b#g‘ study.txt  //把第一行所有a替换为b
1,I bm b Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]#

变量替换实例:

[[email protected] ~]# n=a        //设定变量n的值为a
[[email protected] ~]# m=c       //设定变量m的值为c
[[email protected] ~]# echo $n    //验证变量n的值
a
[[email protected] ~]# echo $m   //验证变量b的值
c
[[email protected] ~]# sed ‘1s#$n#$m#g‘ study.txt  //由于’’单引号,不解释内部变量值所以没有替换
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]# sed "1s#$n#$m#g"study.txt  // “” 双引号表示引用内部的变量,所以替换了
1,I cm c Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[[email protected] ~]# //表示可以利用变量的值来对字符串进行过滤或替换(必须用””双引号)

4.4.2 后向引用

sed软件的( )的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。这种在后面调用的方式,叫做后向引用。

格式:

     sed ‘s#()()#\1\2#g’

  • 第一个()表示第一项,第二个()表示第二项,一次类推,最多九个,不想匹配的可以写在括号后面。
  • \1表示引用前面第一个()括号内的内容,\2表示引用前面第二个()括号内的内容。

实例:

获取ip地址信息

[[email protected] ~]# ifconfig eth0
eth0     Link encap:Ethernet  HWaddr00:0C:29:E4:83:06 
         inet addr:10.0.0.8 Bcast:10.0.0.255 Mask:255.255.255.0
         inet6 addr: fe80::20c:29ff:fee4:8306/64 Scope:Link
          UPBROADCAST RUNNING MULTICAST MTU:1500  Metric:1
          RXpackets:981 errors:0 dropped:0 overruns:0 frame:0
          TXpackets:562 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RXbytes:85039 (83.0 KiB)  TX bytes:62853(61.3 KiB)
[[email protected] ~]# ifconfig eth0 | sed -nr‘2s#^.*r:(.*).?B.*$#\1#gp‘
10.0.0.8 
[[email protected] ~]#
// ^.*r: 表示以任意字符开头到r:为止。
//(.*) 表示任意字符,这里就是我们要取得ip信息。
//.?B.*$ ,.?表示匹配任意两个字符,B.*$表示从B到结尾。

特殊符号的使用:

批量进行文件后缀名更改

[[email protected] lixin]# ls
LinuxAdministartor10.bak  LinuxAdministartor2.bak  LinuxAdministartor4.bak  LinuxAdministartor6.bak  LinuxAdministartor8.bak
LinuxAdministartor1.bak   LinuxAdministartor3.bak  LinuxAdministartor5.bak  LinuxAdministartor7.bak  LinuxAdministartor9.bak
[[email protected] lixin]# ls | sed -nr‘s#(^L.*[0-9])(.*$)#mv & \1.txt#gp‘
mv LinuxAdministartor10.bakLinuxAdministartor10.txt
mv LinuxAdministartor1.bak LinuxAdministartor1.txt
mv LinuxAdministartor2.bak LinuxAdministartor2.txt
mv LinuxAdministartor3.bak LinuxAdministartor3.txt
mv LinuxAdministartor4.bak LinuxAdministartor4.txt
mv LinuxAdministartor5.bak LinuxAdministartor5.txt
mv LinuxAdministartor6.bak LinuxAdministartor6.txt
mv LinuxAdministartor7.bak LinuxAdministartor7.txt
mv LinuxAdministartor8.bak LinuxAdministartor8.txt
mv LinuxAdministartor9.bak LinuxAdministartor9.txt
[[email protected] lixin]# ls | sed -nr‘s#(^L.*[0-9])(.*$)#mv & \1.txt#gp‘ | bash
[[email protected] lixin]# ls
LinuxAdministartor10.txt  LinuxAdministartor2.txt  LinuxAdministartor4.txt  LinuxAdministartor6.txt  LinuxAdministartor8.txt
LinuxAdministartor1.txt   LinuxAdministartor3.txt  LinuxAdministartor5.txt  LinuxAdministartor7.txt  LinuxAdministartor9.txt
[[email protected] lixin]#
// &符号表示前面两个分隔符中间的所有内容
//shell的命令都是bash在执行,所以把命令拼出来后直接交给bash处理即可
时间: 2024-10-14 13:08:31

Linux Sed命令学习笔记的相关文章

linux 网络命令学习笔记

1.临时配置IP 命令 a.  ifconfig eth0 192.168.0.1 netmask 255.255.255.255 b.  或者直接在linux设置里面关于网络设置部分设置 2.网络查看命令 a. netstat -runla         -t 列出TCP协议端口 -u 列出UDP协议端口 -a 列出所有网络链接 -l 列出仅在监听状态的网络服务 (listing) -n 不使用服务器名和域名,只是列出IP地址和端口号 b. ifconfig /all        查看当前

sed命令 学习笔记

sed 基本用法 sed : Stream EDitor 行编辑器      (全屏编辑器: vim) sed: 默认打印模式空间  默认不编辑原文件,仅对模式空间中的数据做处理; 而后,处理结束后,将模式空间打印至屏幕 sed [optiones] 'ADDressCommand' file ... -n : 静默模式 不在默认显示模式空间中的内容 -i : 直接修改原文件 -e SECRIPT -e SECRIPT : 可以同时执行多个脚本 -f /PATH/TO/SED_SCRIPT :

linux常用命令学习笔记

1.df 查看硬盘使用情况. 2.free 查看内存使用情况. 3.cd ~回home目录 cd -返回上一个目录位置. 4.file filename 查看文件的实际类型.注意,文件的实际类型并不是依据文件后缀名. 5.less filename 调用less查看文件内容.使用Enter查看文件下一行,使用space查看文件下一页,使用b(back)查看上一页.使用g查看文件开头,使用G查看文件结尾.使用 /charaters 查找要搜索的内容,使用字母n向前查找下一个出现的字符串,这个字符串

Linux命令学习笔记目录

Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 2.linux命令学习笔记(2):cd命令 3.linux命令学习笔记(3):pwd命令 4.linux命令学习笔记(4):mkdir命令 5.linux命令学习笔记(5):rm 命令 6.linux命令学习笔记(6):rmdir 命令 7.linux命令学习笔记(7):mv命令 8.linux命

linux命令学习笔记-持续更新版

shell 获取前一条命令是否执行成功 if [ $? -eq 0 ];then   echo "success" fi linux命令学习笔记-持续更新版

Linux 新手的学习笔记

1.ln命令 例: /bin/ln -snf /var/www/html/test /var/www/test 2.cp命令 例: cp -r 地址1 地址2 3.rm命令 例: rm -rf 地址 4.vi命令 5.chkconfig命令 例: chkconfig httpd on  (开机自启动httpd服务) 6./etc/inittab 在这里修改是否默认进入图形界面,3为命令行,5为图形界面 7./etc/sysconfig/network-scripts/ 在这里修改网络相关的内容

Linux System Programming 学习笔记(八) 文件和目录管理

1. 文件和元数据 每个文件都是通过inode引用,每个inode索引节点都具有文件系统中唯一的inode number 一个inode索引节点是存储在Linux文件系统的磁盘介质上的物理对象,也是LInux内核通过数据结构表示的实体 inode存储相关联文件的元数据 ls -i 命令获取文件的inode number /* obtaining the metadata of a file */ #include <sys/types.h> #include <sys/stat.h>

sed&&awk学习笔记(1)

sed和awk的基本使用 在sed和awk中,每个指令都包括两个部分:模式和过程.模式是由斜杠(/)分割的正则表达式.过程制定一个或多个将被执行的动作. 执行过程中,读取脚本中的第一个指令并检测当前行的模式,如果没有匹配,这个过程被忽略并读取下一个指令.读取所有的指令,而不是读取与输入行匹配的第一条指令. 所有指令被解释并应用于单个行后,sed输出该行并循环处理每个输入行.awk不自动输出行,脚本中的指令控制awk最终所做的事情. 使用sed 调用sed有两种方法:在命令行上指定编辑指令,或者将

linux网络编程学习笔记之五 -----并发机制与线程?

进程线程分配方式 简述下常见的进程和线程分配方式:(好吧,我仅仅是举几个样例作为笔记...并发的水太深了,不敢妄谈...) 1.进程线程预分配 简言之,当I/O开销大于计算开销且并发量较大时,为了节省每次都要创建和销毁进程和线程的开销.能够在请求到达前预先进行分配. 2.进程线程延迟分配 预分配节省了处理时的负担,但操作系统管理这些进程线程也会带来一定的开销.由此,有个折中的方法是,当某个处理须要花费较长时间的时候,我们创建一个并发的进程或线程来处理该请求.实现也非常easy,在主线程中定时,定