shell三剑客sed实例备忘

sed元字符集

^ # 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ # 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. # 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* # 匹配0个或多个字符,等价于{0,},如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] # 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。  
[^] # 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\) # 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
& # 保存搜索字符用来替换其他字符,如s/love/ **&** /,love这成 **love** 。
\< # 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\> # 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\} # 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。
x\{m,\} # 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
x\{m,n\} # 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。 

打印模式:p print

#每一行输出两次
sed 'p' passwd
#每一行输出一次
sed -n '1p' passwd
#输出第一到三行
sed -n '1,3p' passwd
#打印Jason所在行
sed -n '/Jason/p' passwd
#打印Jason至Jane所在行
sed -n '/Jason/,/Jane/p' passwd
#打印103开头的行
sed -n '/^103/p' passwd
#打印以manager结尾的行
sed -n '/manager$/p' passwd
#以连续三个数字开头的行
sed -n '/[^0-9]\{3\}/p' passwd
#从第一行开始打印,步长2
sed -n '1~2p' passwd
#从第二行开始打印,步长3
sed -n '2~3p' passwd
#打印uid为0或1的行
sed -n '/x:[0|1]:/p' passwd

替换操作:s search

sed '[address-range|pattern-range] s/originalstring/replacement-string/[substitute-flags]' inputfile

#把每一行的第一个:替换成-
sed 's/:/-/' /etc/passwd
#把所有的:替换成-
sed 's/:/-/g' /etc/passwd
#把文件中所有的:替换成-,结果写入文件
sed -i 's/:/-/g' /etc/passwd
#把文件中所有的:替换成-,备份原文件,并把结果写入文件
sed -i.bak 's/:/-/g' /etc/passwd
#把文件中带有root的行整行删除
sed '/root/d' /etc/passwd
#把文件中所有的root都替换成---------
sed '/root/ s/root/---------/g' passwd
#多次匹配,把:和x替换成-
sed -e 's/:/-/g' -e 's/x/-/g' passwd
#把分隔符换成#
sed 's#:#-#g' passwd
#从第三个匹配到的字符开始替换
sed 's/:/-/3g' passwd
#只替换第三个匹配到的字符
sed 's/:/-/3' passwd
#把第二到第五行的manager替换成guozi
sed '2,5 s/manager/guozi/' passwd
#把john所在字符串的行里的manager替换成guozi
sed '/john/ s/manager/guozi/' passwd
#把第四行且包含字符串ram的行中,把developer替换成user
sed '4,/ram/ s/developer/user/' passwd
#把带有john的行,给john替换成[john]
sed 's/john/[&]/' passwd
#把以三个小写字母开头的行,加上{}
sed 's/^[a-z]\{3,\}/{&}/' passwd
#删除所有行的第一个字符
sed 's/^.//' passwd
#删除所有行的第三个字符
sed 's/.//3' passwd
#匹配所有的注释行中带#号的内容,把,后面的内容都删掉
sed '/#/ s/,.*//' passwd
#在每行的结尾加上#
sed 's/$/#/' passwd
#在ifconfig的信息中,找到各网卡对应的ipv4地址,并用{}标记
ifconfig | sed 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/{&}/'

删除操作:d delete

#删除空白行
sed '/^$/d' passwd
#删除文件的第二行
sed '2d' passwd
#删除文件第二行到末尾所有行
sed '2,$d' passwd
#删除第二行到第四行之外的所有行
sed '2,4!d' passwd
#删除文件最后一行
sed '$d' passwd
#删除文件中所有test开头的行
sed '/^test/d' passwd
#删除所有的注释和空白行
sed -e '/^$/d' -e '/^#.*/d' passwd
sed '/^$/d;/^#.*/d' passwd
#附加行号并且删除第二到第五行
nl passwd | sed '2,5d'
#删除从adm到最后一行
sed '/adm/,$d' passwd
#删除adm及其后一行
sed '/adm/,+1d' passwd
#删除1-5行中匹配root的行
sed '1,5{/root/d}' passwd

附加操作:a append

sed '[address] a the-line-to-append' input-file
#在文件的第二行后加多一行------------------
sed '2 a ----------------' passwd
#在文件的第二行到第五行(包括第五行)之间的行后加多一行------------------
sed '2,5 a ------------------' passwd
#在文件的最后一行后加多一行-----------------
sed '$ a ----------------' passwd
#在root所在行后加一行--------------
sed '/root/ a -------------' passwd

插入操作:i insert

# sed '[address] i the-line-to-insert' input-file
#在文件的第二行前加多一行------------------
sed '2 i ----------------' passwd
#在文件的第二行到第五行(包括第五行)之间的行前加多一行------------------
sed '2,5 i ------------------' passwd
#在文件的最后一行前加多一行-----------------
sed '$ i ----------------' passwd
#在root所在行前加一行--------------
sed '/root/ i -------------' passwd

替换命令:c change

# sed '[address] i the-line-to-insert' input-file
#将文件的第二行替换为------------------
sed '2 c ----------------' passwd
#将文件的第二行到第五行(包括第五行)之间的行替换为------------------
sed '2,5 c ------------------' passwd
#将文件的最后一行替换为-----------------
sed '$ c ----------------' passwd
#将包含root的行替换为--------------
sed '/root/ c -------------' passwd

匹配内容标记

# 匹配内容标记
# 用正整数标记同一行中匹配的内容次数,g标记为全局标记
# 将每行第二个匹配到的dog替换为cat,其余匹配到的dog不做改动
echo "dog dog dog dog dog" | sed 's/dog/cat/2' 
# 将每行所有匹配到的dog都替换为cat
echo "dog dog dog dog dog" | sed 's/dog/cat/g'

其他命令

# 转换操作:y 
# 将文本内的abc分别转换为ABC
echo "abcadbdcddd" | sed 'y/abc/ABC/'

# 外部命令-f file 将命今写入文本中,适用于需要重复执行多次的今的情况 
# 将命令写入文本
vim script file.txt
s/brown/white/gs
s/dog/cat/g
s/lazy/sleeping/g
# 通过-t调用文本中的命令
sed -f file.txt passwd

# 外部命令-i in place 替换文本文件
# 将修改后的内容直接写入源文件并替换
# 将源文件加一个后缀名.bak作为备份,新修改的内容写入源文件并替换
sed -i.bak 's/root/change/' passwd

# 将修改过的内容单独保存到filename文件中
# 只会保存修改过的行内容
sed 's/root/change/w change.txt' passwd
# 全局修改可以结合w指令一起使用,但是g必须在w的前面
sed 's/root/change/gw change.txt' passwd

其他

# 小技巧
# 统计文本有多少行,=可以用来输出行号,但是是在新行插入行号
sed -n '$=' passwd
awk 'END{print NR}' passwd
# 输出文本内容时在每行后加入行号
sed -n '=' passwd
awk '{print NR"\t"$0}' passwd
# 输出包含the的行的行号
sed '/the/=' passwd
# 输出以PI开头的行
sed -n '/^mysql/p' passwd
# 输出以数字结尾的行
sed -n '/[0-9]$/p' passwd
# 输出包含单词wood的行,\<,\>用来划定单词的边界
sed -n '/\<wood\>/' passwd
# 输出以wood开头的行
sed -n '/\<wood/p' passwd
# 输出以wood结尾的行
sed -n '/wood\>/p' passwd
# 每行开头添加#
sed 's/^/#/' passwd
# 在包含the的每一行前添加#
sed -n '/the/ s/^/#/' passwd
# 在每行末尾添加EOF字符
sed 's/$/EOF/' passwd
# 将3-5行的所有the替换为THE
sed '3,5 s/the/THE/g' passwd
# 将包含the的行中的o替换为O
sed '/the/ s/o/O/g' passwd

文本迁移

# 迁移符合条件的文本
# H 复制到剪切板
# g 将剪切板中的数据覆盖
# G 将剪切板中的数据追加到指定行
# w 保存为文件
# r 读取指定文件
# a 追加指定内容

# H复制到剪切板--d删除--$G追加到文末
cat passwd | head -5 | sed '/daemon/H;/daemon/d;$G'
cat passwd | head -5 | sed '/daemon/{H,d};$G'
# 将1-5行许移到17行后
cat -n passwd | sed '1,5H; 1,5d; 17G' 
# 将包含the的行另存为新文件
sed '/the/w text.txt' passwd
# 在包含the每行后添加hostname
sed '/the/ s/$/hostname/g' passwd
# 在第三行后插入一个空白行
sed '3G' passwd
# 在第三行后插入新行,内容为NEW
cat -n passwd | sed '3G;3 c NEW'
sed '3 a NEW' passwd
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值