我最爱的流编辑器sed用法总结

来源:互联网 发布:apache压力测试工具 编辑:程序博客网 时间:2024/04/29 06:22

【替换】s

1
sed'/mislost/long/g' filename

sed中,文件的每一行都会作为输入传入到sed中,如果不加g那么上述列子中只会替换每一行


第一个匹配到的mislost。加g则会匹配一行中所有的mislost

 

想要定位一个行,然后去匹配需要这样做

1
sed'/test/s/mislost/long/g' filename

如果这一行包含有test,则将mislost替换为long

在例子中,/test/ 就是一个地址,sed在做操作的时候可以指定0个,1个或者2个地址。每个地

1
sed'/test/s/mislost/long/g' filename

址都是一个描述模式。

·如果没有指定地址,那么命令将应用于每一行。

·如果只有一个地址,那么命令应用于这个地址匹配的任意行。

·如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址的第一行和它后面的行,直到匹配到第二个地址的行(包括此行)

·如果地址后面根由感叹号(!),那么命令就应用于不匹配该地址的所有行。

 

来看一个有趣的例子:

1
sed s'/^$/.Mis'

它用.Mis来取代每一个空行。在替换命令的部分(.Mis)不必转义字面的句点,所以我可以直接用.而不需要用\.来转义它。


一个在替换中列出不想被替换的对象

1
sed '/---/!s/--/lost/'

上面的例子只会将--替换为lost 而不会将---替换为lost-



【删除】d

1
2
sed 'd'   它将删除所有的行
sed '1d'  它将只删除第一行


有一个相当重要的概念:

1
sed '1d' file1 file2  它将只删除file1的第一行,不会删除file2的第一行

·在sed中,行号指由sed维护的内部行数。该计数器不会因为有多个输入文件而重置。因此,不管指定了多少个输入文件,在输入流中也只有一行1。同样,输入流也只有一个最后的行,可以用$来表示最后一行。

 

重要:正则表达式必须封闭在斜杠中

1
2
3
/^$/d     只删除空行
^$d        这样的使用方法则是错误的
$!d         这样表示除了最后一行,都删除掉

 

如果提供两个地址,那么久指定了命令执行的行范围。比如:

1
/^mislost/,/^long/d      删除以mislost开头的到以long开头的左右行

 

有一个很有用的混合使用行地址和模式地址的列子:

1
1,/^$/d

删除了从第一行一直到第一个空行的所有行,可以用来删除某些文件的头文件

清注意,如果文件中没有空行,将删除所有的行!


正常的删除,sed会将匹配到的行整个删除,如果我们想要只删除行中匹配的部分,可以用替换命令并指定一个空得替换,比如:

aabbccdd 想要删除bb 最后的结果为 aaccdd

1
sed 's/bb//'

 

【提取内容】

来看两个简单的提取例子:

1
2
sed -n '/^root/,'/^mislost/p'
sed -n '/^root/p;/^mislost/p'

第一个是提取“以root开头的行到以mislost开头的行之间的所有内容”。

第二个是提取“以root开头的行和以mislost开头的行”


【插入、追加和更改】a    i    c

1
sed '/^a/i\mislost' 插入   在以a开头的行上插入一行mislost
1
sed '/^a/a\mislost' 追加   在以a开头的行下追加一行mislost

1
sed '/^a/c\mislost' 更改   把以a开头的行修改为mislost


在以a开头的行下追加mislost

注意:追加和插入只应用于单个行地址,而不是一个范围内的行。更改命令可以处理一个范围内的行。

这里的更改命令要区别于替换,替换只是将匹配的关键字替换了而不是整个行,c\则修改了整个行的内容。


【列表】l

列表命令(l) 用于显示模式空间的内容,将非打印的字符显示为两个数字的ASCII码。

cat test.txt

1
2
3
aaaa    www.baidu.com
bbbb    www.sina.com.cn
cccc    www.qq.com


sed -n -e "l" test.txt

1
2
3
aaaa\twww.baidu.com$
bbbb\twww.sina.com.cn$
cccc\twww.qq.com$


【转换】y

1
sed 'y/abc/xyz'

y命令开启转换,转换对应为:

a=>x

b=>y

c=>z

PS:转换命令的一个可能的用处是用大写字母替换对应的小写字母


【打印】p


【退出】q

退出命令会使sed停止读取新的输入行(并停止将它们发送到输出)。


1
sed '/50q/'

打印每一行,直到第50行,并且退出,类似于Unix中的head命令。

同样,这个命令也可以用地址范围来实现

1
sed -n '1,50p'


【高级命令】

h或者H    将模式空间的内容复制或者追加到保持空间

g或者G    将保持空间的内容复制或者追加到模式空间

x              交换保持空间和模式空间的内容

【标签】

表示前是任意不多余7个字符的序列。标签占据一行并以冒号开始。

一个有趣的例子

1
sed ':a;N;s/\n//;$!ba'

解析:

:a定义一个标签a

N将下一行的内容添加到当前读入行,并在末尾加一个\n

s/\n//将新行中的\n删掉

$!ba如果读入行不是最后一行就跳转到标签a出继续执行后面的执行

这个命令的作用在于将一个文件中的所有行并列为一行内容

0 0
原创粉丝点击