linux 三剑客老二-sed

简介:

sed是已行为单位对文件进行操作的。

1,查找并替换

[root@90-99 oldboy]# cat test.txt 
oldboy
[root@90-99 oldboy]# sed 's#oldboy#gongli#g' test.txt  #me:只是修改了输出,原文件没变
gongli

#me:

s---替换,

g--全局替换,默认只替换每行第一个匹配到的

n--取消默认输出,

p--把需要的打印出来,

e--编辑,

i--直接修改文件内容(良好的操作习惯,修改之前先备份)

d---删除。

#me:如果替换后的内容为空,则是剪切,可用来做截取功能。

[root@90-99 oldboy]# sed -i 's#oldboy#gongli#g' test.txt #me: -i参数是直接修改文件
[root@90-99 oldboy]# cat test.txt                        
gongli

2,正则替换的时候,\s表示一个空格或者TAB键

[root@robin shell]# cat robin.txt 
1 aa
2   b
3       c

删除文中的所有空格或tab键

[root@robin shell]# sed 's#\s##g' robin.txt   
1aa
2b    
3c

如果不加g参数,那么2和b直接的多个空格只能删除一个。

3,

1)sed  '/a/d;/b/d;s/3/4/g' robin.txt   ##删除包含aa字符串的行,同时删除包含b字符串的行,同时将剩余行中的3替换为4(打印出操作之后的内容,并未真正修改文件)

2)sed -i "/aa/d" robin.txt   ##真正删除文件中的内容,sed的工作原理以行为单位

3)sed -n "20,30p" robin.txt  ##查看第20行至30行的内容   或者 head + tail 配合

4)sed 结合正则匹配指定字符串

[wuxy@90-99 ~]$ cat oldboy.txt                               
i am oldboy teacher


[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) tea.*$#\1#g' oldboy.txt 
oldboy

如果不对括号进行转义就使用sed的 -r 参数,命令如下

[wuxy@90-99 ~]$ sed -r 's#^i.*m ([a-z]*) tea.*$#\1#g' oldboy.txt


[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) cher$#\1#g' oldboy.txt 
i am oldboy teacher ####这个前2个#中的未能完全匹配,该行,则 \1 代表的是整个行
[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) t.*r$#\1#g' oldboy.txt     
oldboy              ####这个前2个#中的完全匹配改行,则 \1 代表的是第一个括号的内容
[wuxy@90-99 ~]$ sed 's#^i.*m \([a-z]*\) .*cher$#\1#g' oldboy.txt 
oldboy

5)要求:取第四行中显示的权限664

[root@90-99 wuxy]# stat test.sh 
  File: `test.sh'
  Size: 50              Blocks: 8          IO Block: 4096   regular file
Device: ca02h/51714d    Inode: 664577      Links: 1
Access: (0664/-rw-rw-r--)  Uid: (  504/    wuxy)   Gid: (  504/    wuxy)
Access: 2014-11-21 14:31:26.772089730 +0800
Modify: 2014-09-28 14:59:34.276001952 +0800
Change: 2014-09-28 14:59:34.320002207 +0800
[root@90-99 wuxy]# stat test.sh  | sed -n '4p'    #me:取第四行
Access: (0664/-rw-rw-r--)  Uid: (  504/    wuxy)   Gid: (  504/    wuxy)
[root@90-99 wuxy]# stat test.sh  | sed -n '4p' | sed 's#^.*(0##g' #me:截掉前面

664/-rw-rw-r--)  Uid: (  504/    wuxy)   Gid: (  504/    wuxy) 
[root@90-99 wuxy]# stat test.sh  | sed -n '4p' | sed 's#/-r.*##g'  #me:截掉后面
Access: (0664
[root@90-99 wuxy]# stat test.sh  | sed -n '4p' | sed 's#^.*(0##g'|sed 's#/-r.*##g'
664  #me:先截掉前面,再截掉后面,剩余的就是664

另外一种直接截取的方法:

[root@90-99 wuxy]# stat test.sh  | sed -n '4p'  | sed 's#^.*(0\([0-9]\+\).*$#\1#g'
664      #me:注意 + 必须要转义!如果使用 * ,则不用转义  {0,} 等价于 *

命令如下:

[root@90-99 wuxy]# stat test.sh  | sed -n '4p'  | sed 's#^.*(0\([0-9]*\).*$#\1#g'

或者

[root@90-99 wuxy]# stat test.sh  | sed -n '4p'  | sed 's#^.*(0\([0-9]\{1,\}\).*$#\1#g'
664     #me:注意 { } 必须要转义   {1,} 等价于 +

或者

[root@90-99 wuxy]# stat test.sh | sed -n 's#^.*(0\([0-9]\+\).*$#\1#gp'    
664     #me:去除了匹配第4行

或者

[root@90-99 wuxy]# stat test.sh | sed -n 's#^.*(0\([0-9]*\).*$#\1#gp'

664     #me:.* 匹配具有贪婪行

以上仅是联系,最简单的方法在这里!!!

[root@90-99 wuxy]# stat test.sh | sed -n '4p' | awk -F"[(/]" '{print $2}'| cut -c 2-4

664



4,在每行的开始添加字符串或者空格

chkconfig  --list | grep "3:on" | awk '{print $1}'| sed 's#^#chkconfig #g'

既在每行的开始添加字段,又在每行的结尾添加字段

chkconfig  --list | grep "3:on" | awk '{print $1}'| sed 's#\(.*\)#chkconfig \1 off#g'

\(.*\) 这个匹配的括号必须要转义,否则报错!或者sed使用 -r 参数,同样可以。如下

chkconfig  --list | grep "3:on" | awk '{print $1}'| sed -r 's#(.*)#chkconfig \1 off#g'

5,打印包含指定字符串的行

[root@robin robin]# ifconfig eth1 | sed -n '/inet addr/p'   
          inet addr:192.168.90.96  Bcast:192.168.90.255  Mask:255.255.255.0


5,用sed过滤掉空行

sed '/^$/d' robin.txt

sed -i '/^$/d' robin.txt   ##直接删除空行


6,sed -r 参数实例一

1
2
3
4
5
6
[rockfall@tmp]$echo  "aaa bbb " |sed  - 's/(.)/A/'
Aaa bbb
[rockfall@tmp]$echo  "aaa bbb " |sed   's/(.)/A/'
aaa bbb
[rockfall@tmp]$echo  "aaa bbb " |sed   's/\(.\)/A/'
Aaa bbb

实例二

一文件: test.txt,内容如下:

1
2
3
4
5
#---------------------------------#
abc1234567890
abc0987654321
xyz1234567890
#---------------------------------#

想输出结果:

1
2
3
1234567890
0987654321
1234567890


sed 命令: sed -n 's/^\([a-z]\{3\}\)\([0-9]\{3,\}\)/\2/p' test.txt 是成功的
但如果用: sed -r -n 's/^\([a-z]{3}\)\([0-9]{3,}\)/\2/p' test.txt 则提示 invalid refrence\2 on 's' commands s RHS
何解?


也可以使用 sed -n -r 's/^([a-z]{3})([0-9]{3,})/\2/p'test.txt


你都用了-r了,还给括号前加\,当然不行了,还加\的括号就代表原义括号了

总之一句话,想少用\  那你就用-r





      本文转自Tenderrain 51CTO博客,原文链接:http://blog.51cto.com/tenderrain/1613173,如需转载请自行联系原作者


相关文章
|
6月前
|
Unix Linux 测试技术
软件测试|Linux三剑客之sed命令详解
软件测试|Linux三剑客之sed命令详解
68 0
|
1月前
|
存储 监控 Linux
性能工具之linux三剑客awk、grep、sed详解
Linux 三剑客 awk,sed和grep 在性能领域广泛用于性能建模、性能监控及性能分析等方面,也是各大互联网公司测试岗高频面试题,中高端测试人员必备技能之一。
52 1
性能工具之linux三剑客awk、grep、sed详解
|
存储 Shell Linux
⭐⭐⭐【Shell 命令集合 文档编辑 】Linux 文件内容处理 sed命令使用指南
⭐⭐⭐【Shell 命令集合 文档编辑 】Linux 文件内容处理 sed命令使用指南
26 0
|
7月前
|
移动开发 Unix Linux
sed命令在Mac和Linux下的不同
sed命令在Mac和Linux下的不同
42 0
|
3月前
|
Linux Perl
Linux sed
Linux sed
160 1
|
3月前
|
Linux Perl
linux命令之sed
linux命令之sed
115 2
|
3月前
|
Linux Perl
百度搜索:蓝易云【Linux中一些Sed命令技巧介绍】
这些是一些常用的Sed命令技巧,它们可以帮助你在Linux系统中对文本进行处理和转换。在使用Sed命令时,建议先使用 `-n`选项进行测试,确保结果符合预期,然后再考虑是否使用 `-i`选项将更改保存到原文件。
291 0
|
4月前
|
Linux 测试技术 Shell
软件测试/测试开发|Linux sed命令详解
软件测试/测试开发|Linux sed命令详解
75 0
|
4月前
|
Linux Perl
Linux|sed命令花式批量修改文件
Linux|sed命令花式批量修改文件
90 0
|
6月前
|
缓存 BI Linux
《Linux操作系统编程》第九章 数据查找和筛选工具 : 了解流编辑器sed和报表生成器awk的简单使用
《Linux操作系统编程》第九章 数据查找和筛选工具 : 了解流编辑器sed和报表生成器awk的简单使用
51 0