sed常用命令
sed命令
一个编辑文件的命令,一行一行的处理编辑
大概执行流程如下所示
对文件操作,简单的概括是增删改查
PS : 大多数sed命令不会直接操作原文件,先有这样的意识
创建文件 test.txt
HELLO LINUX!
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
增
a :新增, 新增的单位是以行为单位,例 4a,第四行的下一行新增一行
命令:sed ‘4a jlkj kjkj cera’ test.txt
ps: jlkj kjkj cera是我新增的内容
i :新增, 新增的单位是以行为单位,例 4i,第四行的上一行新增一行
命令:sed ‘4i jlkj kjkj cera’ test.txt
ps: jlkj kjkj cera是我新增的内容
删
d :删除, 删除的单位是以行为单位,例 2d,删除第二行
命令:sed ‘2d’ test.txt
删除第二行到最后一行
命令:sed ‘2, $d’ test.txt
改
c :替换,替换的单位是以行为单位, 在指定行取代指定的内容
将2-3行替换成 helloword
命令:sed ‘2,3c helloword’ test.txt
查
p:查询,查询的单位是以行为单位, 查询指定行,和 -n 参数一起使用
查询第三行
命令:sed -n ‘3p’ test.txt
正则表达式与sed命令
正则表达式规则可参考:http://blog.csdn.net/dengjili/article/details/78009643
查询
/root/ ====> /线中间存放正则表达式,与awk命令正则表达式相似:http://blog.csdn.net/dengjili/article/details/78028946
查询含有is的行
命令:sed -n ‘/is/p’ test.txt
查询任意内容的行
命令:sed -n ‘/.*/p’ test.txt
增加
在含有linux的下一行添加内容
命令:sed ‘/linux/a test’ test.txt
删除
删除含有linux的行
命令:sed ‘/linux/d’ test.txt
修改
修改稍微特殊一些,语法类似于vim里面的替换。例如例n1,n2s/word1/word2/g ===> n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2
将linux替换成windows
命令:sed ‘s/linux/windows/g’ test.txt
其他命令
多命令参数同时使用
引入-e参数,可以指明多个命令同时使用
将linux替换成windows,再删除第一行
命令:sed -e ‘s/linux/windows/g’ -e ‘1d’ test.txt
将linux替换成windows,再显示第四行
命令:sed -e ‘s/linux/windows/g’ -n -e ‘4p’ test.txt
ps: 查询要与-n命令一起使用
直接修改源文件
引入-i参数,操作源文件
删除第三行
命令:sed -i ‘3d’ test.txt
sed高级参数
简介
sed是面向流的行编辑器。所谓面向流,是指接受标准输入的输入,输出内容到标准输出上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。
具体过程如下: sed将处理的行读入到一个临时缓存区中(也称为模式空间pattern space),sed中的命令依次执行,直到所有命令执行完毕,完成后把该行发送到屏幕上,清理pattern space中的内容;接着重复刚才的动作,读入下一行,直到文件处理结束。
sed每处理完一行就将其从pattern space中删除,然后将下一行读入,进行处理和显示。处理完输入 文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
重要结论:上述命令都是在模式空间pattern space中进行的
流程如下所示
引入Hold Space空间
Hold Space空间相当于临时空间,可以与pattern space空间进行数据拷贝
流程如下所示
命令 | 含义 |
---|---|
g | 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容被覆盖 |
G | 将hold space中的内容append到pattern space后 |
h | 将pattern space中的内容拷贝到hold space中,原来hold space里的内容被覆盖 |
H | 将pattern space中的内容append到hold space后 |
d | 删除pattern中的所有行,并读入下一新行到pattern中 |
D | 删除multiline pattern中的第一行,不读入下一行 (这一点笔者未理解) |
命令:g
==> 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容被覆盖
命令:G
==> 将hold space中的内容append到pattern space后
命令:h
==> 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容被覆盖
命令:H
==> 将pattern space中的内容append到hold space后
命令:d
==> 删除pattern中的所有行,并读入下一新行到pattern中
来看一个例子
创建文件 test.txt
this is 1 line
this is 2 line
this is 3 line
倒序输出功能
命令:sed ‘1!G;h;$!d’ test.txt
解析
- 第一行不执行G命令。ps:只有第一行不执行G命令,其他行是要执行G命令
- 执行h命令。ps:所有行都执行h命令
- 最后一行不执行d命令。ps:只有第一行不执行d命令,其他行是要执行d命令
图解析过程
完整图
由于看不清楚,将图分成两部分
左面
右面
ok啦
可以思考一下输出什么?
创建文本1.txt
1
2
3
4
命令
sed ‘H;g’ 1.txt