shell之sed

2019-07-14  本文已影响0人  IT小池

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 打印

  1. 打印 test.txt 的 13 行
[root@VM_0_14_centos test]# sed -n '13p' test.txt
  1. 打印 test.txt 的 第 8 行开始,到第 13 行结束的内容
[root@VM_0_14_centos test]# sed -n '8,13p' test.txt
  1. 打印 test.txt 的 第 8 行开始,然后 +5 行结束的内容
[root@VM_0_14_centos test]# sed -n '8,+5p' test.txt
  1. 打印 test.txt 的 开头匹配 test 的字符串内容
[root@VM_0_14_centos test]# sed -n '/^test/p' test.txt
  1. 打印 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容
[root@VM_0_14_centos test]# sed -n '/^test/,/^test1/p' test.txt
  1. 打印 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
  1. 删除 test.txt 的 13 行
[root@VM_0_14_centos test]# sed -i '13d' test.txt
  1. 删除 test.txt 的 第 8 行开始,到第 13 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,13d' test.txt
  1. 删除 test.txt 的 第 8 行开始,然后 +5 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,+5d' test.txt
  1. 删除 test.txt 的 开头匹配 test 的字符串内容
[root@VM_0_14_centos test]# sed -i '/^test/d' test.txt
  1. 删除 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容
[root@VM_0_14_centos test]# sed -i '/^test/,/^test1/d' test.txt
  1. 删除 test.txt 的 包含 test 内容的行开始,到开头到第 5 行结束的内容
[root@VM_0_14_centos test]# sed -i '/^test/,5d' test.txt
  1. 删除 test.txt 的中从第 5 行开始,到包含以 test 内容的行开始的内容(推荐
[root@VM_0_14_centos test]# sed -i '5,/^test/d' test.txt
  1. 删除 test.txt 的中从第 5 行开始,到最后行的所有内容
[root@VM_0_14_centos test]# sed -i '5,$d' test.txt
  1. 经典需求)删除 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
  1. 替换 test.txt 的 1 行的 old 为 new
[root@VM_0_14_centos test]# sed -i '1s/old/new/' test.txt
  1. 替换 test.txt 的 第 8 行开始,到第 13 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,13s/old/new/' test.txt
  1. 替换 test.txt 的 第 8 行开始,然后 +5 行结束的内容
[root@VM_0_14_centos test]# sed -i '8,+5s/old/new/' test.txt
  1. 替换 test.txt 的 开头匹配 test 的字符串内容
[root@VM_0_14_centos test]# sed -i '/^test/s/old/new/' test.txt
  1. 替换 test.txt 的 开头为 test 的行开始,到开头为 test1 的行结束的内容的 old 替换成 new
[root@VM_0_14_centos test]# sed -i '/^test/,/^test1/s/old/new/g' test.txt
  1. 替换 test.txt 的 开头为 test 的行开始,到行中包含 test1 的所有行的 old 替换成 new
[root@VM_0_14_centos test]# sed -i '/^test/,/test1/s/old/new/g' test.txt
  1. 替换 test.txt 的 以 test 开始的行,到开头到第 5 行结束的内容
[root@VM_0_14_centos test]# sed -i '/^test/,5s/old/new' test.txt
  1. 替换 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中引用变量时注意事项:
  1. 匹配模式中存在变量。则建议使用双引号
  2. sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号
上一篇下一篇

猜你喜欢

热点阅读