shell中sed命令

目录

 sed参数---i

sed参数---e

sed参数---n

sed操作

sed操作----删除

(1)行号查找删除范围       

(2)内容匹配

sed操作----添加

(1)行号范围

(2)内容匹配

sed操作---替换

(1)行号匹配  c

(2)内容匹配  s

sed操作---展示

sed操作---退出

sed实际使用


sed参数---i

含义:-i参数实际改变被操作文件

sed ‘2,5d’ test.txt        #文件test.txt文件没有变化,标准输出结果

sed  -i  ‘2,5d’ test.txt   #文件test.txt文件变化,无标准输出结果

sed参数---e

含义:可以拼接多个sed操作

sed -e '2d' -e '9d'  test.txt  #删除test.txt文件的2行,9行,对被操作文件没有实际变化
sed -i -e '2d' -e '9d'  test.txt  #加上i参数就让上面的命令被操作文件变化,没有标准输出

sed参数---n

含义:悄悄的,标准输出的东西就没有了

          不得不说下面的操作---展示p

sed -n -e '2d' -e '9d'  test.txt   #没有标准输出了
sed -e '2,5p'  test.txt            # 展示2-5行内容,但是实际标准输出是全部test.txt内容,是不是事与愿违了
f=`sed -n -e '2,5p'  test.txt`        #只是悄悄的把text.txt的整体输出干掉了,是我们想要的2-5了

echo $f


# n参数后面可以跟着多个操作,含义不展示所有内容,只展示了p的内容
#匹配内容root所有的行,s操作,p展示操作,q退出操作
nl /etc/passwd | sed -n '/root/{s/bash/han/;p;q}'

sed操作

sed操作----删除

命令使用:d

(1)行号查找删除范围   

注意:逗号前不能小于1、缺省;逗号后缺省 ----报错

                逗号后面超出范围不报错,没有存在的行操作失效

cat -n test.txt|sed '2d'           #删除test.txt文件中第二行
cat -n test.txt|sed '2,5d'         #删除test.txt文件中第二行到第五行
cat -n test.txt|sed '2,$d'         #删除test.txt文件中第二行到最后($符号表示最后的意思)

   

(2)内容匹配

cat -n test.txt|sed '/1/d'        #  /1查找含有1的行,/d操作是d
cat -n test.txt|sed '/^a.*$/d'    #  正则找a开头的行删除
cat test.txt|sed '/^a.*$/d'       #  比较上面的命令--这个才是正确的,cat的 -n命令的输出内容会把行号也算入sed命令操作的范围所以就不会找到a开头的行


# 删除空行
sed -i '/^$/d' test.txt

sed操作----添加

命令:前i后a

(1)行号范围

#\区别/使用
# \是说明这一行没有写完换行的意思,也就让a操作追加了多行还有空行
nl test.txt | sed '2a\      Drink tea or ......\
             sdfasdff\
\
             eqwweqwe\
             eeeeeeee'

#在2和3行后面都追加了多行内容
nl test.txt | sed '2,3a\      Drink tea or ......\                                                            
             sdfasdff\
\
             eqwweqwe\
             eeeeeeee'

# \这个正斜杠分隔了操作和操作的内容, 保证后面空格是实际有效
nl test.txt | sed '2,3a\      Drink tea or'

# 空格分隔操作和操作内容,空格没有意义
nl test.txt | sed '2,3a      Drink tea or'

# i是在指定行前追加
nl test.txt | sed '2,3i      Drink tea or'

(2)内容匹配

# 找到匹配内容at的行
# 操作:在之前添加内容
# i操作和操作的内容没有分隔符号哦
sed '/at/iDrink tea or'  test.txt

# /Drink tea or整个算操作的内容
sed '/at/i/Drink tea or'  test.txt

# 正则匹配
sed '/^a.*$/iDrink tea or'  test.txt

# a后面添加
sed '/^a.*$/aDrink tea or'  test.txt

#正斜杠是操作和操作内容的分隔符
sed '/at/a\    Drink tea or'  test.txt

sed操作---替换

(1)行号匹配  c

#2到5行替换为Drink tea or,空格为操作和操作内容的分隔符
cat -n test.txt | sed '2,5c    Drink tea or'

#2到5行替换为Drink tea or,正斜杠为操作和操作内容的分隔符
cat -n test.txt | sed '2,5c\    Drink tea or'

#多行操作就是正斜线
cat -n test.txt | sed '2,5c\    Drink tea or\
       qifei\
       xihuan\
\
      jieshu'


#行号也能配合s操作
#第二行替换dog内容为cat,只替换第一次
sed '2s/dog/cat/' data1.txt 

#第二行到第六行替换dog内容为cat,每行只替换第一次
sed '2,6s/dog/cat/' data1.txt 

(2)内容匹配  s

注意点:g参数的使用,g就是所有匹配内容替换,或者指定替换哪一个地方(int)

#空行替换为kkkkkkkkkkkkk
#s是操作所以前面不是反斜杠,添加反斜杠就是/s/找匹配内容s的意思了
sed 's/^$/kkkkkkkkkkkkk/' test.txt

#替换匹配内容1为k,但是每一行只替换一次
sed 's/1/k/' test.txt

#替换匹配内容1为k,但是每一行只替换第二次出现的1
sed 's/1/k/2' test.txt

#替换匹配内容1为k,每一行替换所有的1
sed 's/1/k/g' test.txt

#操作c和s的区分
#s是替换每一行中的匹配内容
#c是整个行操作替换
sed '/1/ckkkkkkkkk' test.txt
sed '/1/c\       kkkkkkkkk' test.txt

sed实际使用

1、操作内容本身有/,需要\转义下

2、vim和vi命令使用sed命令

# vi命令后要esc按键进入命令行模式
# n 为数字,若 n 为 .,表示从当前行开始到最后一行 
# 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符

追加不会!!!!

#############################替换使用s操作##############################################

:s/vivian/sky/          # 替换当前行第一个 vivian 为 sky 
  
:s/vivian/sky/g         # 替换当前行所有 vivian 为 sky 
  
:n,$s/vivian/sky/      # 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky 
  
:n,$s/vivian/sky/g     # 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
  
:%s/vivian/sky/         #(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky 
  
:%s/vivian/sky/g        #(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
  
:s#vivian/#sky/#        # 替换当前行第一个 vivian/ 为 sky/ 


#############################删除d操作##############################################
: /vivian/d              # 删除含有vivian的第一个行,有多行含有vivian时只删除了第一次出现的那行                         
:1023,1044d              # 行号删除方式

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值