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 }
原创粉丝点击