sed
来源:互联网 发布:电梯维保软件 编辑:程序博客网 时间:2024/03/29 18:52
sed是一个流编辑器,通过多种类型转换来修改流经它的的文本。sed不会改变提供给它的源文件,而是把改变后的结果发送到stdout.
sed中每次处理一行。
sed的元字符有
.*[]^${}/+?|()
元字符用法:
除^外,其他符号在[]内如果要匹配自己本身字符要加/,否则是元字符的意义。^在[]内开头表示否定,在[]内的其他地方表示本身字符。
^ 还可用于匹配一行的开头;$用于匹配一行的结尾。
/^The/ 匹配以“The”开头的行
/end.$/ 匹配以“end.”结尾的行
/^T.*/.$/ 匹配以“T”开头以“.”结尾的行
/dog/匹配所有出现的“dog”
/t.m/匹配所有先出现t,然后隔一个字符再出现m的字符,如tim,tom等。
/(<expresion>
/(<expresion>
/) 括号的分组用法
/{1,4/} 限制次数的用法
* 前面的字符0个或多个
/+ 前面的字符1个或多个
& 在替换域中使用表示整个匹配部分,如s/hat/"&"/,&表示前面两个/之间部分
[[:alpha:]]匹配任意字母字符,大写或小写
[[:alnum:]]匹配任意字母数字字符,相当于[0-9A-Za-z]
[[:blank:]]匹配空格或制表字符
[[:digit:]]匹配数字,相当于[0-9]
[[:lower:]]相当于[a-z]
[[:upper:]]相当于[A-Z]
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符,包括空格、制表符、NL、FF、VT、CR
sed一些常用选项:
-n 抑制自动输出(用命令p,P输出)
-i 直接修改文件内容
sed的执行流程:
a)开始时,把第一行读入模式空间。
b)把命令逐一应用到模式空间,如果没有其他控制干预,则所有命令执行完后就会到达脚本尾部,这时输出模式空间的内容,然后清除模式空间。
c)读入下一行(永远记住当前行是模式空间中行号最大的那行,特别是用到N命令和控制流程改变时往往很容易搞错下一行是什么),重复b)过程。
上面说的“其他控制干预”包括标号的跳转,D命令。D命令删除模式空间中的第一个/n之前(包括这个/n)的所有内容,保留第一个/n之后的内容,然后返回脚本开始处。(有些死循环导致不能到达脚本最后,死循环中又没有用p,P命令,这时有内容输出是由于一些命令有立刻输出模式空间的功能(如n输出模式空间的内容然后读入下一行而不用返回脚本顶端)。最好还是不要依赖sed的自动输出了,自己显式p吧)。
典型的sed命令行选项:
替换(s)
替换指令格式如下:sed [address1[,address2]] s/pattern/replacement/[n|g] filename
标志g表示对文本全部行进行操作;标志n表示将要替换第n次 出现的表达式。
sed 's/this/that/' file.txt 把输入文件中每一行第一次出现的this替换为that. 与下句效果等同:
sed 's/this/that/1' file.txt
如果要把第二次出现的this替换为that,把n设置为2即可。
sed 's/is/IS/g' file.txt 整个文件中出现的每个is都被IS取代
5s/this/that/ 把第五行的this 替换为that,仅对第五行进行这个操作。
1,5s/this/that/ 1,5表示从第一行到第五行,把第一行到第五行的this 替换为that,仅对第五行进行这个操作。
5,$s/this/that/ $ 把最后五行的this 替换为that
5,$!s/this/that/ !不要对给出的行进行操作, 即不要对最后五行的this 替换为that
也可以指定样式的范围,而不仅是行数的范围,如:
sed '/^The/s/this/that/' 把所有以The开头的行进行替换。
sed '/start/,/end/s/index/idx/g' 对从包含start的行到包含end的行之间所有行进行替换操作。
删除(d)
sed '1,5d' file.txt 删除文件的前5行
应用!来反转约束条件:
sed '1,5!d' file.txt删除前5行之外的所有行
打印(p)
打印可视为删除的逆操作。但有一个不同,必须指明-n标志,以免向输出端重复打印。
sed -n '1,5p' file.txt打印前5行
sed -n '/^:/p' file.txt 打印以冒号开头的行
行的添加(a)、插入(i)、改变(c) //注意,改变的是整个新行
sed '/start/a/ ' file.txt在包含start的行后插入一个空白行。
sed '$i/ ' file.txt 在文件的末尾插入一个空白行。
sed '/secret/c/DELETED' file.txt 查找单词secret,然后把包含它的整行替换为DELETED。
可以使用{}把多个指令编成一个指令组加以执行。
下面这段脚本 在匹配到关键字的行之前插入一个start行,之后播放一个sed行,然后把这一行本身替换成DELETED。
sed '/secret/{
i/
--start
a/
--end
c/
DELETED
}' file.txt
退出(q)
退出即结束sed编辑阶段。
sed '10q' file.txt p 这个命令发送文件的前10行,完成第10行后,就结束sed编辑阶段。
这个命令可以完成GNU/Linux 中head命令的功能。
轮换(y)
y指令可以转换文本,可以把一个字符转换为另一个。要提供两个字符集合,第一个是查找集合,第二个是替换集合。
例如下面示例,如果遇到A,就把它替换为a,以此类推。这个示例把所有大写字母转换成小写字母。
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file.txt
进行转换时,样式和替换字符按照一一对应的关系进行处理,因些,这两个字符串的长度必须相等。
行数(=)
=用于发送当前的行数。可用于发送匹配给定的查找字符串的行数,或是发送输入文件的行数。
例如,如果想知道哪些行包含了指定的查找样式 ,可用以下脚本:
sed -n '/This/=' file.txt 这个脚本 会发送包含单词This的那些行的行数,即每行的行号。
保持样式 空间(h)
在sed中,有很多空间(缓冲器),sed命令就在其中进行操作。每一输入行都首先复制到样式空间。样式空间是由sed临时拥有的空间,供sed命令执行。在对样式 空间完成脚本所指定的工作后,这一行就会被 复制输出。
在sed中还有保留空间,可以把样式 空间中的内容 复制到保留空间,然后在晚些时候取回他们。保留空间只是一个临时缓冲器,但在要记录某些行进可能非常有用。
使用保留缓冲器,可以把样式空间中的内容存储到保留缓冲器中,然后直接对样式缓冲器进行操作。下面这个示例演示了发送改变后的和未改变的行。
#表示对sed脚本 的注释,#后的字符都会识别为注释。
sed '{
#store the pattern space to the hold buffer
h
#perform the substitution on the pattern space
s/is/IS/
# append the unaltered line to the pattern sapce
G
}' file.txt
这个脚本发送改变后的行,然后立即发送未改动的行。
一些有用的sed单行程序:
#Emit the first 10 lines of a file(such as 'head')
sed 10q file.txt
#Emit a double-spaced version of the file
sed 'G' file.txt
#Emit number of lines in input file
sed -n '$=' file.txt
#Emit the last line of a file
sed '$!d' file.txt
#Emit all lines greater than 30 characters in length
sed -n '/^./{30/}/p' file.txt
#Emit all non-blank lines
sed '/^$/d' file.txt
#Remove all blank lines at the top of a file
sed '/./,$!d' file.txt
附加:
从shell向sed传值
要从命令行中向s e d传值,值得注意的是用双引号,否则功能不执行。REPLACE="GO"; sed "s/go/$REPLACE/g" quote.txt
下面是一些一行命令集。([ ]表示空格, [ ]表示t a b键)
‘s / \ . $ / / g’ 删除以句点结尾行
‘s / [ ] [ ] [ ] * / [ ] / g’ 删除一个以上空格,用一个空格代替
‘s / ^ [ ] [ ] * / / g’ 删除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 删除句点后跟两个或更多空格,代之以一个空格
‘/ ^ $ / d’ 删除空行
‘s / ^ . / / g’ 删除第一个字符
‘s /CO L \ ( . . . \ ) / / g’ 删除紧跟C O L的后三个字母
‘s / ^ \ / / / g’ 从路径中删除第一个\
‘s / [ ] / [ ] / / g’ 删除所有空格并用t a b键替代
‘S / ^ [ ] / / g’ 删除行首所有t a b键
‘s / [ ] * / / g’ 删除所有t a b键
在这个特别的规则表达式中,出现了 '[[:space:]]' 字符类。这只是一个特殊的关键字,它告诉 sed 与 TAB 或空格匹配。如果愿意的话,可以不输入 '[[:space:]]',而输入 '[',然后是空格字母,然后是 Ctrl-V,然后再输入制表键字母和 ']' -- Control-V 告诉 bash 要插入“真正”的制表键,而不是执行命令扩展。使用 '[[:space:]]' 命令类(特别是在脚本中)会更清楚。 solaris当然还是要用/usr/xpg4/bin/sed.
关于 's///' 命令的另一个妙处是 '/' 分隔符有许多替换选项。如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在 's' 之后指定一个不同的字符来更改分隔符。sed -e 's:/usr/local:/usr:g' mylist.txt 在该例中,使用冒号作为分隔符。
http://www.mscto.com
更多字符匹配
'[ ]' 规则表达式语法还有一些附加选项。要指定字符范围,只要字符不在第一个或最后一个位置,就可以使用 '-',如下所示:
'[a-x]*'
这将匹配零或多个全部为 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符类来匹配空格。以下是可用字符类的相当完整的列表:
字符类 描述
[:alnum:] 字母数字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字 [0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写 [a-z]
[:print:] 非控制字符
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写 [A-Z]
[:xdigit:] 十六进制数字 [0-9 a-f A-F] http://www.mscto.com
有时,可能要指定应用到一个地址的多个命令。这在执行许多 's///' 以变换源文件中的字和语法时特别方便。要对一个地址执行多个命令,可在文件中输入 sed 命令,然后使用 '{ }' 字符将这些命令分组,如下所示:1,/^END/{ s/[Ll]inux/GNU\/Linux/g s/samba/Samba/g s/posix/POSIX/g p }
- sed
- Sed
- SED
- sed
- sed
- sed
- sed
- sed
- sed
- Sed
- sed
- sed
- sed
- sed
- sed
- sed
- sed
- sed
- Linux环境.bashrc设置
- 怎样成为一个优秀的程序员
- Eclipse小技巧收集
- SAP web 开发 (第一篇 bsp 开发 非mvc模式 )
- 【转自小木虫】“再牛逼的伟人,也有苦逼的青春”——物理版
- sed
- activex控件与窗口分割
- ubuntu virualbox install
- MOSS AJAX WebParts开发环境设置
- 无法连接到WMI提供程序。您没有权限或者该服务器无法访问
- 显示excel在datagridview以及在spreedsheet显示excel(office2010)
- 强制删除页面上出错的WebParts
- Attribute在.net编程中的应用(一)
- ORA-38856: Cannot mark instance UNNAMED_INSTANCE_2 (redo thread 2) as enabled