linux命令之sed

简介

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用。它能执行与编辑器 vi 相同的编辑任务,但是sed不提供交互式使用方法,除非重定向到文件,否则,sed默认输出到标准输出。

原理

sed 逐行处理文件(或输入),并将输出结果发送到屏幕。 sed 的命令就是在 vi 编辑器中见到的那些。 sed 把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲。sed 处理完模式空间中的行后(即在该行上执行 sed 命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。 sed 每处理完输入文件的最后一行后, sed 便结束运行。 sed 把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。

正则表达式

[]:无论中括号内几个字符,都只代表一个
[n1-n2]:列出想要取得字符范围
[^]:反向选择中括号的字符
^word:以word为首的行
word$:以word结尾的行
^$:空白行
.(点):代表一定有一个任意字符
*:代表重复前一个字符0到无穷次
.*:代表任意字符
\(..\)  #标记匹配字符,如'\(good\)',good被标记为1。 
\:转义特殊字符,使之成为原本的意思
\<      '\<grep'匹配包含以grep开头的单词的行。    
\>    'grep\>'匹配包含以grep结尾的单词的行。    
x\{m\}  重复字符x,m次。    
x\{m,\}  重复字符x,至少m次    
x\{m,n\}  重复字符x,至少m次,不多于n次

常用操作指令

d删除命令
$:代表最后一行
a:后面追加
i:前面追加
c:替代
p:列举某几行(-n必须要有,如果没有会重复输出所选取的行)
s:搜寻并取代 sed  ‘s/要被取代的字符串/新的字符串/g’
-i:直接修改文件
e 多重编译
q 命令表示退出命令
(新增多行的话要加上\)

使用举例

创建名为catfile的文件,内容如下,以该文件作为测试内容
这里写图片描述


  • d删除命令
    sed 先将输入行从文件复制到模式缓存区,然后对该行执行 sed命令,最后将模式缓存区的内容显示在屏幕上。如果发出的是命令 d,当前模式缓存区的输入行会被删除,不被显示
[fangfang@VM_0_9_centos ~]$ sed '3d'(删除第三行)
name    uid    chinese    math   english
wang    100     70        75      70
sun     102     89        76      88
qian    103     97        64      87

[fangfang@VM_0_9_centos ~]$ sed '3,$d'(删除第三道最后一行)
name    uid    chinese    math   english
wang    100     70        75      70

[fangfang@VM_0_9_centos ~]$ sed '3,4d'(删除第3-4行)
name    uid    chinese    math   english
wang    100     70        75      70
qian    103     97        64      87

[fangfang@VM_0_9_centos ~]$ cat catfile(原始内容)
name    uid    chinese    math   english
wang    100     70        75      70
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87
  • p:列举某几行(-n必须要有,如果没有会重复输出所选取的行)
[fangfang@VM_0_9_centos ~]$ sed -n '3,5p'(打印3-5行)
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87

[fangfang@VM_0_9_centos ~]$ head -n 5  catfile| tail -n 3 catfile(打印3-5行)
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87
  • s替换命令 sed ‘s/要被取代的字符串/新的字符串/g’

说明,s表示替换,g表示全局,如果没有g则只替换每行第一个zhao

[fangfang@VM_0_9_centos ~]$ sed 's/zhao/zhou/g' catfile
name    uid    chinese    math   english
wang    100     70        75      70
zhou    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87
  • ,(逗号)指定行的范围
[fangfang@VM_0_9_centos ~]$ sed -n '3,5p'3-5行)
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87

[fangfang@VM_0_9_centos ~]$ sed -n '/zhao/,/qian/p' catfile(zhao qian之间的行)
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87

[fangfang@VM_0_9_centos ~]$ sed -n '2,/qian/p' catfile(第2行开始到第一个以qian之间所有的行)
wang    100     70        75      70
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87
  • e 多重编译
    说明:sed后面接两个以上的命令时 要加上e,前一次的结果会影响后一次的结果
[fangfang@VM_0_9_centos ~]$ sed -e '2,4d' -e 's/wang/test/g' catfile
name    uid    chinese    math   english
qian    103     97        64      87
[fangfang@VM_0_9_centos ~]$ sed -e '2,4d' -e 's/qian/test/g' catfile
name    uid    chinese    math   english
test    103     97        64      87
  • a追加
    追加将新文本到文件中当前行(即读入模式的缓存区行)的后面
[fangfang@VM_0_9_centos ~]$ sed '2a apple' catfile
name    uid    chinese    math   english
wang    100     70        75      70
apple
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87
  • i增加
    追加将新文本到文件当中的当前行的前面
[fangfang@VM_0_9_centos ~]$ sed '2i banana' catfile
name    uid    chinese    math   english
banana
wang    100     70        75      70
zhao    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87
  • n 命令表示下一条命令。 sed 使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何 sed 命令都将应用到匹配行,紧接着的下一行上
[fangfang@VM_0_9_centos ~]$ sed '/zhao/{n;s/sun/liu/;}' catfile
name    uid    chinese    math   english
wang    100     70        75      70
zhao    101     80        60      90
liu     102     89        76      88
qian    103     97        64      87

找到zhao的第一行之后的下一行中的sun替换为liu

  • y表示替换
[fangfang@VM_0_9_centos ~]$ sed '1,3y/abc/ABC/' catfile
nAme    uid    Chinese    mAth   english
wAng    100     70        75      70
zhAo    101     80        60      90
sun     102     89        76      88
qian    103     97        64      87

将一到三行中的所有的小写字母abc替换成为大写字母ABC

  • q 命令表示退出命令
[fangfang@VM_0_9_centos ~]$ sed '4q' catfile(打印第四行后退出)
name    uid    chinese    math   english
wang    100     70        75      70
zhao    101     80        60      90
sun     102     89        76      88

[fangfang@VM_0_9_centos ~]$ sed '/zhao/{ s/zhao/ming/;q; }' catfile
name    uid    chinese    math   english
wang    100     70        75      70
ming    101     80        60      90
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值