linux sed 命令总结
前一篇的文章里,我们介绍了常见的文本处理工具。这篇文章里, 主要总结一下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里有更多的详细信息