sed命令语法格式
sed [参数] [条件/指令] [文件名称]
参数 | 功能 |
---|---|
-n | 取消默认输出 |
-i | 修改文件内容 |
-e | 执行多个指令 |
-r | 识别扩展正则符号 |
指令 | 功能 |
---|---|
p | 输出 |
d | 删除 |
s | 替换 |
g | 匹配文件内容中的所有信息 |
i | 在当前行上一行插入信息 |
a | 在当前行下一行插入信息 |
c | 替换正行信息 |
增加测试文本
[root@sed ~]# cat << EOF > test.sh
> 1001,AAAA,CEO
> 1002,BBBB,CFO
> 1003,CCCC,CTO
> 1004,DDDD,COO
> 1005,EEEE,CIO
> EOF
[root@sed ~]# cat test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
一、sed - 查询
1、查看文本所有内容
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
2、查看文本第二行内容
[root@sed ~]# sed -n '2p' test.sh
1002,BBBB,CFO
3、如果不加-n
参数的话,则显示文本的所有内容,在这里可以将-n
理解为消除多余输出
[root@sed ~]# sed '2p' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
4、查看文本2-4
行的内容(连续)
[root@sed ~]# sed -n '2,4p' test.sh
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
5、查看文本指定行(第2和第4行
)内容(不连续)
[root@sed ~]# sed -n '2p;4p' test.sh
1002,BBBB,CFO
1004,DDDD,COO
6、使用-e
参数将指令分开执行
[root@sed ~]# sed -ne '2p' -e '4p' test.sh
1002,BBBB,CFO
1004,DDDD,COO
7、使用!
排除指定单行
[root@sed ~]# sed -n '2!p' test.sh
1001,AAAA,CEO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
8、使用!
排除2-4行(连续)
[root@sed ~]# sed -n '2,4!p' test.sh
1001,AAAA,CEO
1005,EEEE,CIO
9、查询文本中带有00
字段的内容
[root@sed ~]# sed -n '/00/p' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
10、查询文本中CEO
到CTO
中的所有字段
[root@sed ~]# sed -n '/CEO/,/CTO/p' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
11、查询以1003
开头的字段
[root@sed ~]# sed -n '/^1003/p' test.sh
1003,CCCC,CTO
12、查询文本最后一行内容
[root@sed ~]# sed -n '$p' test.sh
1005,EEEE,CIO
二、sed - 增加
1、新增内容到文本第二行下
中需要加一个参数-i
,但不可与-n
连用,否则会将文件内容清空
[root@sed ~]# sed -i '2a 1111111111' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1111111111
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
2、新增内容到文本第二行上
中需要加一个参数-i
,但不可与-n
连用,否则会将文件内容清空
[root@sed ~]# sed -i '2i 222222222222' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
222222222222
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
3、向文本最后追加内容
[root@sed ~]# sed -i '$a 333333333333' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
333333333333
4、向文本中追加多行内容
[root@sed ~]# sed -i '3a 4444444\n5555555' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
4444444
5555555
1004,DDDD,COO
1005,EEEE,CIO
5、向文本指定行添加多行内容
[root@sed ~]# sed -e '2i 1111111' -e '2a 2222222' test.sh
1001,AAAA,CEO
1111111
1002,BBBB,CFO
2222222
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
6、向每行行首添加#
字符
[root@sed ~]# sed -i 's/^/#/g' test.sh
[root@sed ~]# sed '' test.sh
#1001,AAAA,CEO
#1002,BBBB,CFO
#1003,CCCC,CTO
#1004,DDDD,COO
#1005,EEEE,CIO
三、sed - 修改
1、修改指定内容
[root@sed ~]# sed -i 's#CTO#CCCCCCCCCCCC#g' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CCCCCCCCCCCC
1004,DDDD,COO
1005,EEEE,CIO
2、修改文本中的内容O
修改为W
[root@sed ~]# sed -i 's#O#W#' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEW
1002,BBBB,CFW
1003,CCCC,CTW
1004,DDDD,CWW
1005,EEEE,CIW
3、匹配到某行的单个内容,并修改整行内容:CIO
字段行修改为6666666
[root@sed ~]# sed -i '/CIO/c 66666666' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COW
66666666
4、修改指定行的正行内容
[root@sed ~]# sed -i '1c AAAAAAAA' test.sh
[root@sed ~]# sed '' test.sh
AAAAAAAA
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
四、sed - 删除
1、删除空行
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COW
[root@sed ~]# sed -i '/^$/d' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COW
2、删除#
字符
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
######
[root@sed ~]# sed -i '/#/d' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
3、删除指定行内容
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COW
66666666
[root@sed ~]# sed -i '5d' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COW
4、删除1-3
行内容(连续)
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COW
[root@sed ~]# sed -i '1,3d' test.sh
[root@sed ~]# sed '' test.sh
1004,DDDD,COW
5、删除指定多行内容
方法一:
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
[root@sed ~]# sed -i '1d;3d' test.sh
[root@sed ~]# sed '' test.sh
1002,BBBB,CFO
1004,DDDD,COO
1005,EEEE,CIO
方法二:
[root@sed ~]# sed '' test.sh
1002,BBBB,CFO
1004,DDDD,COO
1005,EEEE,CIO
[root@sed ~]# sed -e '1d' -e '2d' test.sh
1005,EEEE,CIO
6、删除每行行首#
字符
[root@sed ~]# sed '' test.sh
#1001,AAAA,CEO
#1002,BBBB,CFO
#1003,CCCC,CTO
#1004,DDDD,COO
#1005,EEEE,CIO
[root@sed ~]# sed -i 's/^#//' test.sh
[root@sed ~]# sed '' test.sh
1001,AAAA,CEO
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
六、sed - 排除
1、排除第一行内容
[root@sed ~]# sed -n '1!p' test.sh
1002,BBBB,CFO
1003,CCCC,CTO
1004,DDDD,COO
1005,EEEE,CIO
2、排除连续多行内容
[root@sed ~]# sed -n '1,3!p' test.sh
1004,DDDD,COO
1005,EEEE,CIO
练习
1、批量修改文件的扩展名,将villian.txt
修改为villian.png
[root@sed zwl]# touch villian{1..5}.txt
[root@sed zwl]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月 4 13:52 villian1.txt
-rw-r--r--. 1 root root 0 3月 4 13:52 villian2.txt
-rw-r--r--. 1 root root 0 3月 4 13:52 villian3.txt
-rw-r--r--. 1 root root 0 3月 4 13:52 villian4.txt
-rw-r--r--. 1 root root 0 3月 4 13:52 villian5.txt
[root@sed zwl]# ls villian*.txt|sed -r 's#(.*)txt#mv & \1png#g'|bash
[root@sed zwl]# ll
总用量 0
-rw-r--r--. 1 root root 0 3月 4 13:52 villian1.png
-rw-r--r--. 1 root root 0 3月 4 13:52 villian2.png
-rw-r--r--. 1 root root 0 3月 4 13:52 villian3.png
-rw-r--r--. 1 root root 0 3月 4 13:52 villian4.png
-rw-r--r--. 1 root root 0 3月 4 13:52 villian5.png
PS:替换命令 s/A/B/g
,B中的 \1
指的就是正则A中的第一个小括号里匹配到的内容(.*)
,相当于mv \1 png
PS:专业命令:rename 原文件的格式 修改后文件的格式 原文件的文件名
------rename .txt .png villian*.txt