shell脚本之sed详解(1)

摘要:
shell脚本之sed详解Sed是一个非交互性文本流编辑器。vi中的正则表达式命令在sed中大多可以通用。sed常用选项-escript指定sed编辑命令-fscriptfile指定的文件中是sed编辑命令-n寂静模式,抑制来自sed命令执行过程中的冗余输出信息,比如只显示那些被改变的行。find.-name“*.[c|h]”|xargssed-i‘s///g’9、参数f:以下三个命令相等,先在包含字符串test的任意行上,将111替
shell脚本之sed详解 (sed命令 , sed -e , sed s/ new / old / ... )

Sed是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。vi中的正则表达式命令在sed中大多可以通用。

sed常用选项

-e script 指定sed编辑命令

-f scriptfile 指定的文件中是sed编辑命令

-n 寂静模式,抑制来自sed命令执行过程中的冗余输出信息,比如只显示那些被改变的行。

-i[SUFFIX], –in-place[=SUFFIX] 替换和备份源文件

edit files in place (makes backup if extension supplied)

1. 参数p: 打印匹配行

$ sed -n ’2p’/etc/passwd 打印出第2行
$ sed -n ’1,3p’/etc/passwd 打印出第1到第3行
$ sed -n ‘$p’/etc/passwd 打印出最后一行
$ sed -n ‘/user/p’ /etc/passwd 打印出含有user的行
$ sed -n ‘/$/p’ /etc/passwd 打印出含有$元字符的行,$意为最后一行
$ sed -n ‘$=’ ok.txt	打印总行数

2.参数a和i: 插入文本和附加文本(插入新行)

$ sed -n ‘/FTP/p’/etc/passwd 打印出有FTP的行
$ sed ‘/FTP/a 456′ /etc/passwd 在含有FTP的行后面新插入一行,内容为456
$ sed ‘/FTP/i 123′ /etc/passwd在含有FTP的行前面新插入一行,内容为123
$ sed ‘/FTP/i “123″’ /etc/passwd在含有FTP的行前面新插入一行,内容为”123″
$ sed ’5 a 123′ /etc/passwd 在第5行后插入一新行,内容为123
$ sed ’5 i “12345″’ /etc/passwd 在第5行前插入一新行,内容为”123表达式45″

sed-搜索结果后面增加嵌入代码

#!/bin/bash
#export LANG=zh_CN
find ./ -name “*.html” -exec grep 10000008/100 ‘{}’ ; -exec sed -i ‘/10000008/a<!--# include file="/code.html"-->‘ {} ;

3.参数d:删除文本

删空格

sed -i ‘s/[ ]*//g’ ~/$cid.txt

删除无内容空行

sed ‘/^$/d’ file.conf > file.new.conf
sed -i ‘/^$/d’ ~/$cid.txt

删第一行

sed -i ’1d’ ~/$cid.txt

删前两行

sed -i ’1,2d’ ~/$cid.txt

del多行

cat SCTP.log |sed ’1d;2d;$d’

删除最后一行:

sed -e ‘$d’ file

删除最后两行:

sed ‘N;$!P;D’ file
sed ‘N;$!P;$!D;$d’ file

删除最后n行:

$vi sed.sh
$!/bin/bash
A=$(sed -n ‘$=’ file)
sed $(($A-n+1)),${A}d file

$ sed ‘/user/d’/etc/passwd

删除带有string的行(del include love row head)

sed -i ‘/^love/d’ file
sed -i ‘/love/d’ file

vi删除包含strings前4行,后34行

:/strings/-4,+34d

删除配置文件中#号注释行

sed ‘s##.*##’ file.conf > file.new.conf
sed ‘s,#.*,,’

删除配置文件中//号注释行

sed ‘s#//.*##’ file.conf > file.new.conf
sed ‘s@//.*@@’

删除由空格和Tab而成的空行

sed ‘/^[[:space:]]*$/d’ file.conf > file.new.conf
sed ‘/^[[:space:]]*$/d’

删除尾行的空格

sed -e ‘s/.$//’ file > file.new.conf

在尾行添加1个空格

sed ‘s/[0-9]$/& /g’ file > flile.new.conf

4. 参数s:替换文本,替换命令用替换模式替换指定模式,格式为:

[ a d d r e s s [,address]] s/pattern-to-find/replacement-pattern/[g p w n]

$ sed ‘s/user/USER/’/etc/passwd 将第1个user替换成USER,g表明全局替换
$ sed ‘s/user/USER/g’/etc/passwd 将所有user替换成USER
$ sed ‘s/user/#user/’/etc/passwd 将第1个user替换成#user,如用于屏蔽作用
$ sed ‘s/user//’/etc/passwd 将第1个user替换成空
$ sed ‘s/user/&11111111111111/’/etc/passwd 如果要附加或修改一个很长的字符串,可以使用( &)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面,这里是把&放前面
$ sed ‘s/user/11111111111111&/’/etc/passwd 这里是将&放后面 在包含字符串test的任意行上,将111替换成222
$ sed ‘/test/s/111/222/g’ sample.txt

5. 快速一行正则表达式命令 下面是一些一行命令集。([ ]表示空格,[TAB]表示t a b键)

‘s/ . $//g’ 删除以句点结尾行
‘-e/abcd/d’ 删除包含a b c d的行
‘s/[ ] [ ] [ ] */[ ]/g’ 删除一个以上空格,用一个空格代替
‘s/^ [ ] [ ] *//g’ 删除行首空格
‘s/ . [ ] [ ] */[ ]/g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/^ $/d’ 删除空行
‘s/^ .//g’ 删除第一个字符
‘s/COL  ( . . .  )//g’ 删除紧跟C O L的后三个字母
‘s/^ ///g’ 从路径中删除第一个
‘s/[ ]/[TAB]//g’ 删除所有空格并用t a b键替代
‘S/^ [TAB]//g’ 删除行首所有t a b键
‘s/[TAB] *//g’ 删除所有t a b键

6、用sed删除文件中的换行符,杀鸡哪需牛刀?

tr -d ‘
’ file
真的需要sed

sed -nr ‘ H;
$ {
x;
s/
//g;
p
}’

7、sed获取ip

[root@c01 ~]# ifconfig eth0|sed -ne ‘s/^.*addr:([0-9.]*).*$/1/p’
192.168.100.180

[root@c01 ~]# ifconfig eth0 | sed -e ‘/inet/!d’ -e ‘s/.*addr://’ -e ‘s/[ ].*//’
192.168.100.180

8、,/转义字符

echo /usr/local/bin | sed ‘s//usr/local/bin//common/bin/’
find . -name “*.html” |xargs sed -i ‘s#/canApp/evaluation/html/	index.html#http://www.wallcopper.com/eva/#g’

都可以把当前目录下的.c .h文件中的TAB替换成4个空格。

find . -name “*.[c|h]” | xargs sed -i ‘s/	/ /g’

9、参数f:

以下三个命令相等,先在包含字符串test的任意行上,将111替换成222,再将字符f替换成hello

$ sed ‘/test/s/111/222/g ; s/f/hello/g’ sample.txt
$ sed -e ‘/test/s/111/222/g’ -e ‘s/f/hello/g’ sample.txt
选项-f: 将要执行的所以编译命令放入在文件中
$ more scher
/test/s/111/222/g
s/f/hello/g’ sample.txt
$ sed -f scher sample.txt

10、参数q: 表示跳离sed。最多与一个地址参数配合。

打印出含有a或b字符的行,一旦遇到数字,即刻停止打印。

$ sed -n -e ‘/[0-9]/q’ -e ‘/[a b]/p’

到china quit

sed ‘china/q’ myfile.txt

11、参数-i后缀:替换并将源文件备份改后缀

$ sed -i.bak ‘s/123/efg/g’ a.txt 备份源文件

12、参数r:在某行插入文件

$ sed -i ’2 r readfile.txt’ writefile.txt

13、参数w:读入文件中的内容存入到另一文件中(temp.txt)。最多与一个地址参数配合。

将sample.txt文件中含test字符串的数据行,copy至temp.txt档中储存(原temp.txt中无内容)

$ sed -e ‘/test/w temp.txt’ sample.txt

14、参数y:转换数据中的字符。最多与两个地址参数配合。

1.将文件中的小写字母替换成大写字母。

$ sed -e ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/’ sample.txt
其中前后字符个数必须相同.

15、参数!:表示不执行函数参数。 将文件中除了important字符串,其余全删除。

$ sed -e ‘/important/!d’ sample.txt

16、参数=:表示印出资料的行数。最多与两个地址参数配合。 1.印出文件资料并显示行数。

$ sed -e ‘=’ sample.txt

计算总行数

$ sed -n ‘$=’ a.txt

17、其它参数 参数#:表示对文字的注释。

参数N:表示添加下一笔资料到pattern space内。最多与两个地址参数配合。(添加下一笔:添加一笔资料后,继续添加这个资料的下一行数据到pattern space内) 1,将文件中的数据合并。文件内容如下: UNIX LINUX

$ sed -e ‘N’ -e’s/
/\,/g’ sample.txt
结果如下: UNIX,LINUX
  • 参数D:表示删除pattern space内的第一行资料。最多与两个地址参数配合。

  • 参数P:打印出pattern space内的第一行资料。

$ sed -n -e ‘N’ -e ‘P’ sample.txt

利用N将下一行资料(即:偶数行)添加到pattern space内,在利用P打印出奇数行。 解释过程:由于N的作用,使得每次添加一条资料到pattern space后,先不执行操作,而是继续添加这个资料的下一行到pattern space内, 然后P参数打印出第一行资料。

参数h:表示暂存pattern space的内容至hold space(覆盖)。最多与两个地址参数配合。

参数H:表示暂存pattern space的内容至hold space(添加)。最多与两个地址参数配合。

参数g:表示将hold space的内容放回至pattern space内。(覆盖掉原pattern space内的数据)

参数G:表示将hold space的内容放回至pattern space内。(添加大到原pattern space数据之后)

将文件中所有空行删除,并在每一行后面增加一个空行。

$ sed ‘/^$/d;G’ sample.txt

将文件中所有空行删除,并在每一行后面增加两个空行。

$ sed ‘/^$/d;G;G’ sample.txt

参数x:表示交换hold space与pattern space内的数据。

将文件第三行的数据替换成第一行的数据。

$ sed -e ’1h’ -e ’3x’ sample.txt
参数b:

参数t:

如果使用sed对文件进行过滤,最好将问题分成几步,分步执行,且边执行边测试结果。

经验告诉我们,这是执行一个复杂任务的最有效方式。

参考:

http://www.2cto.com/os/201111/112217.html

http://markmail.org/download.xqy?id=w5pncjwnrs77lz3s&number=2

http://www.grymoire.com/Unix/Sed.html

http://sed.sourceforge.net/sed1line.txt

转自:

http://www.wallcopper.com/linux/769.html

免责声明:文章转载自《shell脚本之sed详解(1)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python中numpy的where()函数R语言做正态分布检验下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Shell 变量

Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号...

Ubuntu脚本修改IP信息

#!/bin/bash cd /etc/network #清除4-9行 sed -i '4,9d' interfaces #在第3行添加网卡名称 sed -i "3a auto ${1}" interfaces #在第4行添加 sed -i "4a iface ${1} inet static" interfaces #在第5行添加IP...

一个.NET Core开发者的Linux入门学习笔记

用.NET Core开发也有一段时间了,但是由于工作原因一直都是在Windows系统上进行的开发,一直想学习Linux然后把.NET Core开发的程序跑在Linux上,然后把心得体会记录一下发布再博客园,奈何拖延症泛滥,所以只写过一篇《CentOS开发ASP.NET Core入门教程》之后就继续征战Windows了!作为新年Flag之一就是学习Docke...

shell 获取命令执行的结果,获取结果返回

shell脚本中, 执行其他脚本时,想判断执行其他脚本的结果是否成功 if [ $? -ne 0 ];then echo "fail" else: echo "success" 如果返回0,代表命令执行成功 返回1或者其他不等于0的值,代表失败 -eq //equals等于 -ne //no equals不等于 -gt //greater...

Linux cp强制覆盖解决办法

情景: 当在linux中执行cp命令时,有时候需要将一个目录中的所有文件覆盖其他一个目中的所有文件。 但是,使用cp -Rf 时还是会提示是否覆盖。 解决的方法是: shell>unalias cp 原因: 你执行: shell>alias 你会发现 alias cp=’cp -i’ 所以你需要注释掉cp 重新执行:shell>cp -R...

(20135213)信息安全系统设计基础第一周学习总结(共12课)课程(6~12)

【所有参考资料皆来源与实验楼,特此声明】 【第六课】 文件打包与压缩 实验介绍 Linux 上常用的 压缩/解压 工具,介绍了 zip,rar,tar 的使用。 一、文件打包和解压缩 在讲 Linux 上的解压缩工具之前,有必要先了解以下常见常用的压缩包文件格式。在 Windows 上我们最常见的不外乎这三种*.zip,*.rar,*.7z后缀的压缩文件,...