sed
的处理模式是对每一行都进行处理,而且会先输出原行再输出匹配的行:
1. -n :只打印模式匹配行
[root@VM_0_14_centos test]# sed -n '/test/p' test.txt
注意:不加 / 就是对每一行都进行处理
2. -e :直接再命令行进行sed编辑,默认选项
[root@VM_0_14_centos test]# sed -n -e '/test/p' -e '/TEST/p' test.txt
注意:多个匹配的时候 -e 必须写,一个可以不写
或者使用 使用扩展正则表达式 -r
,如:
[root@VM_0_14_centos test]# sed -n -r '/test|TEST/p' test.txt
3. -f :编辑动作保存在文件中,指定文件执行
4. -r :支持扩展正则表达式
[root@VM_0_14_centos test]# sed -n -r '/test|TEST/p' test.txt
5. -i :直接修改文件内容
[root@VM_0_14_centos test]# sed -n 's/test/test100/g;p' test.txt
注意:此时不会修改 test.txt 原文件中的test内容,只把匹配到的输出到终端,如果把 -n 缓存 -r 就会直接修改原文件
,如下:
[root@VM_0_14_centos test]# sed -i 's/test/test100/g' test.txt
sed编辑命令
查询
p 打印
- 打印 test.txt 的 13 行
[root@VM_0_14_centos test]# sed -n '13p' test.txt
- 打印 test.txt 的 第 8 行开始,到第 13 行结束的内容
[root@VM_0_14_centos test]# sed -n '8,13p' test.txt
- 打印 test.txt 的 第 8 行开始,然后 +5 行结束的内容
[root@VM_0_14_centos test]# sed -n '8,+5p' test.txt
- 打印 test.txt 的 开头匹配 test 的字符串内容
[root@VM_0_14_centos test]# sed -n '/^test/p' test.txt
- 打印 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容
[root@VM_0_14_centos test]# sed -n '/^test/,/^test1/p' test.txt
- 打印 test.txt 的 包含 test 内容的行开始,到开头到第 5 行结束的内容
[root@VM_0_14_centos test]# sed -n '/^test/,5p' test.txt
增加
a 在匹配行后面追加
1.在 test,txt 文件第 10 行后面追加 ' add test1 '
[root@VM_0_14_centos test]# sed -i '10a add test1' test.txt
2.在 test,txt 文件第 10 行和第 20 行后面追加 ' add test1 '
[root@VM_0_14_centos test]# sed -i '10,20a add test1' test.txt
3.在 test,txt 文件所有行中包含 test1 行后面追加 ' add test1 '
[root@VM_0_14_centos test]# sed -i '/test/a add test1' test.txt
i 在匹配行前面追加
1.在 test,txt 文件每行前面追加 ' add test1 '
[root@VM_0_14_centos test]# sed -i 'i add test1' test.txt
2.在 test,txt 文件中以 test1 开头的前面行追加 ' add test1 '
[root@VM_0_14_centos test]# sed -i '/^test1/i add test1' test.txt
r 将文件内容追到加匹配行后面
1.将 test2.txt 文件的内容追加到 test,txt 文件第 20 行后面
[root@VM_0_14_centos test]# sed -i '20r /test2.txt' test.txt
2.将 test2.txt 文件的内容追加到 test.txt 文件匹配 test1 后面
[root@VM_0_14_centos test]# sed -i '/test1/r /test2.txt' test.txt
w 将匹配行写入外部文件
1.将 test,txt 文件匹配到的 test1 行追加到 /test2.txt 文件中
[root@VM_0_14_centos test]# sed -i '/test1/w /test2.txt' test.txt
2.将 test2.txt 文件的内容追加到 test.txt 文件匹配 test1 后面
[root@VM_0_14_centos test]# sed -i '/test1/r /test2.txt' test.txt
删除
d 删除
删除 test.txt 的第一行
[root@VM_0_14_centos test]# sed '1d' test.txt
- 删除 test.txt 的 13 行
[root@VM_0_14_centos test]# sed -i '13d' test.txt
- 删除 test.txt 的 第 8 行开始,到第 13 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,13d' test.txt
- 删除 test.txt 的 第 8 行开始,然后 +5 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,+5d' test.txt
- 删除 test.txt 的 开头匹配 test 的字符串内容
[root@VM_0_14_centos test]# sed -i '/^test/d' test.txt
- 删除 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容
[root@VM_0_14_centos test]# sed -i '/^test/,/^test1/d' test.txt
- 删除 test.txt 的 包含 test 内容的行开始,到开头到第 5 行结束的内容
[root@VM_0_14_centos test]# sed -i '/^test/,5d' test.txt
- 删除 test.txt 的中从第 5 行开始,到包含以 test 内容的行开始的内容(
推荐
)
[root@VM_0_14_centos test]# sed -i '5,/^test/d' test.txt
- 删除 test.txt 的中从第 5 行开始,到最后行的所有内容
[root@VM_0_14_centos test]# sed -i '5,$d' test.txt
- (
经典需求
)删除 test.txt 的中所有注释(#)
与空行($)
与空格([:blank:],这里指#,指#号前的所有空格)
,三条编辑命令
[root@VM_0_14_centos test]# sed -i '/^#/d;/^$/d;/[:blank:]*#/d' test.txt
修改
1. s/pattern/string/ :查找并替换,查找符合pattern模式的字符串,将其替换为string
2. s/pattern/string/g :g表示全部行内匹配
3. s/pattern/string/2g :2g表示,同一行内,只替换从第2个开始到剩下所有符合条件的字符串匹配的
4. s/pattern/string/2 :2g表示,同一行内,只替换前2个,剩下的不替换(3g表示只替换前3个)
5. s/pattern/string/ig :加i参数表示匹配时忽略大小写,g表示匹配到的全部替换
替换 test.txt 的中每行的 old 为 new
[root@VM_0_14_centos test]# sed -i 's/old/new/' test.txt
- 替换 test.txt 的 1 行的 old 为 new
[root@VM_0_14_centos test]# sed -i '1s/old/new/' test.txt
- 替换 test.txt 的 第 8 行开始,到第 13 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,13s/old/new/' test.txt
- 替换 test.txt 的 第 8 行开始,然后 +5 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,+5s/old/new/' test.txt
- 替换 test.txt 的 开头匹配 test 的字符串内容
[root@VM_0_14_centos test]# sed -i '/^test/s/old/new/' test.txt
- 替换 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容的 old 替换成 new
[root@VM_0_14_centos test]# sed -i '/^test/,/^test1/s/old/new/g' test.txt
- 替换 test.txt 的 开头为 test 的行开始,到行中包含 test1 的所有行的 old 替换成 new
[root@VM_0_14_centos test]# sed -i '/^test/,/test1/s/old/new/g' test.txt
- 替换 test.txt 的 以 test 开始的行,到开头到第 5 行结束的内容
[root@VM_0_14_centos test]# sed -i '/^test/,5s/old/new' test.txt
- 替换 test.txt 的 包含 test 内容的行,把 test 替换成 TEST
[root@VM_0_14_centos test]# sed -i '/test/s/TEST/g' test.txt
其他编辑命令
= 显示行号
[root@VM_0_14_centos test]# sed -n '/test/=' test.txt
反向引用
& 和 \1 引用匹配到的整个串
在 test.txt 中搜寻以1开头,然后跟两个任意字符,以e结尾的字符串都追加上 r
[root@VM_0_14_centos test]# sed ‘s/1..e/&r/g' test.txt
注意:在使用 \1 进行匹配替换时,必须把 patten 加上括号(),括号也必须转义,如:
[root@VM_0_14_centos test]# sed -i ‘s/\(1..e\)/\1r/g' test.txt
sed中引用变量时注意事项:
- 匹配模式中存在变量。则建议使用双引号
- sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号
网友评论