sed的使用

sed的使用注意

sed操作的是文件内容的拷贝,而不是文件本身,就是将一行一行的文件内容读到sed的模式空间,在这个空间内执行sed命令,然后打印执行后的内容,清空模式空间,再继续操作下一行。,使用选项 -n 设置不显示。

使用sed进行增删改查

新增

比如我新建一个文件叫 text.txt :

test.png

1.使用i插入当前行的前一行
[root@localhost shell]# sed '2i 我插在第二行的前面' test.txt
2.使用a插入当前行的后一行
[root@localhost shell]# sed '2a 我插在第二行的后面' test.txt
3.使用i/a多行增加,两个行语句之间用换行符‘\n’ 连接
[root@localhost shell]# sed '2a 我插在第二行的后面,变成第三行\n我是第二条数据' test.txt
4.使用i/a多行不同项增加,写多个sed语句用-e连接
[root@localhost shell]# sed -e '2i nihaoa' -e '3i nicai' -e '5i nicaiwocaibucai' test.txt

删除

1.删除指定行
[root@localhost shell]# sed '3d' test.txt
2.删除连续行
[root@localhost shell]# sed '4,6d' test.txt
3.删除不连续多个指定行
[root@localhost shell]# sed -e{3,5,7}d test.txt
4.删除正则表达式匹配的行
[root@localhost shell]# sed -ri '/^[a-z]/d' test.txt
-r 表示使用标准正则表达式,/^[a-z] /匹配所有字符开头的行,d表示执行删除操作,这里会操作源文件,如需删除请备份,使用i.bak命令,这样系统会自动备份一个同名的.bak文件

查找

p表示打印,p打印的内容为模式空间中被命令操作的行内容
1.查询单行
[root@localhost shell]# sed -n '1p' test.txt
2查询多行
[root@localhost shell]# sed -n '1,4p' test.txt
3.查询结果反向显示
[root@localhost shell]# sed -n '1,3!p' test.txt
4.正则查询
[root@localhost shell]# sed -rn '/[^0-9a-z]/p' test.txt

替换

1.替换所有行单行第一次出现的内容
[root@localhost shell]# sed 's#sss#rrr#' test.txt
[root@localhost shell]# sed 's/sss/rrr/' test.txt
这两种写法都可以,看个人喜好
2.替换所有行,每次匹配到的内容
[root@localhost shell]# sed 's/sss/rrr/g' test.txt
3.按正则表达式的规则替换指定行,这里1表示行号,后面的是替换规则和内容
[root@localhost shell]# sed -r '1s/[a-z]+/rrr/' test.txt

使用sed进行正则操作

正则表达式基础:

主要操作符就是这四个.?+,外加取组(),比较常用的就这五个了,简单介绍一下,方便我们操作后面的例题。
点(.): 匹配一个任意字符,经常和.
搭配用表示匹配0到任意个数的任意字符。
星(*): 匹配0个或多个前一个字符。
问(?): 匹配0个或1个前一个字符或表达式,一般用来限制贪婪模式。
加(+): 匹配一个或多个前一个字符,和*类似。
圆括号():存放按匹配规则匹配后的分组数据。

正则练习

1.把/etc/passwd 中第一个单词和最后一个单词调换位置

使用 -r 标准正则:
sed -r 's%(^.*)(:x:.*:)(/.*$)%\3\2\1%g'
sed -r 's/(\w+)(.*)\/(.*)/\3\2\/\1/'   (\d表示数字字符。\s表示空白字符。\w表示组成单词的字符。)
不加 -r 选项:
sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' passwd

2.把/etc/passwd 中出现的第一个数字和最后一个单词调换位置

使用 -r 标准正则:
sed -r 's%(^.*x:)([[:digit:]]+)(:.*:)(/.*$)%\1\4\3\2%g'
sed -r 's/([^0-9]+)([0-9])(.*)\/(\w+)/\1\4\3\/\2/'
不加 -r 选项:
sed 's/#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' passwd

3.把/etc/passwd 中第一个数字移动到行末尾
使用 -r 标准正则:

sed -r 's%(^.*x:)([[:digit:]]+)(:.*:)(/.*$)%\1\3\4\2%g'
sed -r 's/([^0-9]+)([0-9])(.*)/\1\3\2/'
不加 -r 选项:
sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd

4.把/etc/passwd 20行到末行最前面加“aaa”

sed '20,$ s/^/aaa/'

练习题

实例1:删除文件每行的第二个字符。
sed -r 's/(.)(.)(.*$)/\1\3/' passwd
实例2:删除文件每行的最后一个字符。
sed -r 's/(.*)(.$)/\1/' passwd
实例3:删除文件每行的倒数第2个单词。
sed -r 's/(.*)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]+)([a-zA-Z]+)([^a-zA-Z]*$)/\1\2\4\5/' passwd
实例4:交换每行的第一个字符和第二个字符。
sed -r 's/(.)(.)(.*$)/\2\1\3/' passwd
实例5:删除一个文件中所有的数字。
sed 's/[0-9]//g' passwd
实例6:用制表符替换文件中出现的所有空格。
sed 's/ /\t/g' passwd
实例7:把所有大写字母用括号()括起来。
sed -r 's/([A-Z])/(\1)/g' passwd
实例8:打印每行3次。
sed -n 'p;p;p' passwd
实例9:隔行删除
sed '1~2{=;d}' passwd
实例10:将格式为mm/yy/dd的日期格式换成 mm;yy;dd
date '+%m/%y/%d' | sed 's/\//;/g'

你可能感兴趣的:(sed的使用)