linux sed 命令总结

发表于: 2013年11月09 00:00

前一篇的文章里,我们介绍了常见的文本处理工具。这篇文章里, 主要总结一下sed这款工具,sed 的全称是流编辑器。主要是用来对文本进行过滤和转换

首先我们介绍一下,在sed中执行的动作有下面几种

:::bash
=              #打印当前的行号
a \text        #将text添加到新行里去
i \text        #将文本插入到新行里
r filename     #将filename这个文件中的内容添加到新行里去


c \text        #将指定的行替换为text
d              #删除匹配的行             
p              #输出匹配的行

y          #将一个字符替换为另外一个字符,类似与tr的一些功能

s/regexp/replacement/flags      #用replacement上内容替换regexp匹配的内容

上面的内容看起来很抽象,下面看看具体的例子

:::bash 
sed 's/123/asdf/'         #将第一个匹配到123替换为asdf
              #注意这里只会替换一次

sed 's/123/asdf/g'        #这里g表示全局替换,所有的123都会替换为asdf

sed 's/123/asdf/4'    #表示将第四个123替换为asdf
              #flags是具体数字n时,表示替换第n个匹配

sed 's/123/asdf/5g'   #这里表示从第5个匹配的开始,一直替换到行结束
              #本例中表示忽略前面的4个123

上面的内容主要是针对单行的文本,如果需要处理一个文本的指定行,则可以通过地址符来定位 地址符一般包括下面几种情况

:::bash
sed '7s/123/asdf/g'        #命令中的7s表示只把第7行的123替换为asdf

sed '7,+3s/123/asdf/g'     #7,+3s 表示从第7行开始,把接下来的3行里的123都替换了
               #也就是说替换7,8,9这3行里的123

sed '3,8i/asdf'        #这里的3,8就是表示在3到8行每行都插入一个asdf
                           #注意这里使用了i操作符,所以是插入asdf

sed '4,$d'         #这里出现的新符号$表示一行或者一个文件的结束
               #这条命令就是表示只保留前面的3行,删除后面所有内容(d表示删除)

sed '1~3s/123/asdf/'      #1~3这种写法是GNU sed的扩展,不是通用写法
               #从第一行开始,每3行替换一次(这里替换的是1,4,7...行的内容)

在sed中还可以用正则匹配表达式匹配一类文本,其中正则表达中可能用到的元字符如下

:::bash
*           # 匹配零或多个元字符  
            # ab*   可以匹配ab abc abcd等

\+          # 匹配1或多个元字符  
            # ab\+  可以匹配aba abcd等,但是不可匹配ab

\?          # 匹配0或1个元字符     
                # ab\?  可以匹配ab abc 但是不能匹配abcd

\{i\}       # 匹配i个元字符
            # ab\{2\}   只能匹配abb

\{i,j\}     # 匹配i到j个元字符 
            # ab\{2,4\}  只能匹配abb,abbb,abbb

\{i,\}      # 匹配至少i个元字符 
            # ab\{2,\}   匹配abb,abbb等(至少a后面跟上2个b)

.           # 匹配任何字符

^           # 匹配一行的开始(行首)
$           # 匹配一行的结束(行尾)
            # ^$    匹配一个空行

[]          # 匹配这个集合范围内的元字符
            # [a-bA-Z0-9] 匹配所有字母和数字

[^]         # 匹配不再这个集合内的元字符
                # [^0-9]   匹配除数字之外的字符

除此之外,sed中还可以用ASCII码值进行匹配,具体如下

::bash
\dXXX       #十进制ASCII码是XXX
\oXXX       #八进制ASCII码值是XXX
\xXX        #十六进制ASCII码是XX

#例子
\d49       #表示数字1
\x33       #表示数字3

下面再介绍下sed中的处理匹配字符的几个特殊标记

####& 表示已经匹配了的字符串

:::bash
echo "123" |sed 's/[0-9]/!& /g' #把每个数字替换为在这个数字前加上一个!在后面加一个空格
!1 !2 !3   #这里是输出

####\1 子串匹配 子串 匹配用来匹配样式的一部分

:::bash
echo "123asdf456cvf"|sed 's/\([1-9]\+\)\([a-z]\+\)/ \2 /g'
#这条shell中\([1-9]\+\) 能匹配阿拉伯数字,并把它储存在\1中
#\([a-z]\+\) 能匹配小写的英文字母,储存在\2
#最后/ \2 /g 将所有匹配的小写字母输出出来,最终输出如下

 asdf  cvf

sed命令就介绍到这里,linux的info里有更多的详细信息

© 2018 - fluyy - 粤ICP备17114935号