目录
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 # 行号删除方式