第四课 Shell脚本编程-sed用法

第四课 Shell脚本编程-sed用法

文章目录

  • 第四课 Shell脚本编程-sed用法
    • 第一节 sed的选项
    • 第二节 sed中的pattern详解
    • 第三节 sed中的编辑命令详解

第一节 sed的选项

  1. sed(Stream Editor),流编辑器。对标准输出或文件逐行进行处理
  2. 语法格式:
    • 第一种形式: stdout | sed [option] "pattern command"
    • 第二种形式:sed [option] "pattern command" file
      第四课 Shell脚本编程-sed用法_第1张图片
vim sed.txt

I love python 
I love PYTHON
Hadoop is bigdata frame

# 本身输出一次 p打印输出一次
[root@localhost ~]# sed 'p' sed.txt
I love python
I love python
I love PYTHON
I love PYTHON
Hadoop is bigdata frame
Hadoop is bigdata frame
# 只是p输出一次
[root@localhost ~]# sed -n 'p' sed.txt
I love python
I love PYTHON
Hadoop is bigdata frame
# 只处理打印python的行 本身也输出一次
[root@localhost ~]# sed '/python/p' sed.txt
I love python
I love python
I love PYTHON
Hadoop is bigdata frame
# -n 静默模式 只打印处理行
[root@localhost ~]# sed -n '/python/p' sed.txt
I love python
# -e 连接多个匹配命令
[root@localhost ~]# sed -n -e '/python/p' -e '/PYTHON/p' sed.txt
I love python
I love PYTHON

vi edit.sed
/python/p # 输入
# -f指定文件中的模式进行处理
[root@localhost ~]# sed -n -f edit.sed sed.txt
I love python
# 默认不支持扩展正则表达式
[root@localhost ~]# sed -n  '/python|PYTHON/p' sed.txt
# -r 支持扩展正则表达式
[root@localhost ~]# sed -n -r '/python|PYTHON/p' sed.txt
I love python
I love PYTHON

# 替换输出原文件没修改
[root@localhost ~]# sed -n 's/love/like/g;p' sed.txt
I like python
I like PYTHON
Hadoop is bigdata frame
# -i 替换原文件
[root@localhost ~]# sed -i 's/love/like/g' sed.txt
[root@localhost ~]# cat sed.txt
I like python
I like PYTHON
Hadoop is bigdata frame

第二节 sed中的pattern详解

第四课 Shell脚本编程-sed用法_第2张图片

# 1、LineNumber 接指定行号
sed -n "17p" file # 打印file文件的第17行
# 2、startLine ,EndLine 定起始行号和结束行号
sed -n "10, 20p" file # 打印file文件的10到20行
# 3、startLine ,+N 指定起始行号,然后后面N行
sed -n "10,+5p" file # 打印file文件中从第10行开始,往后面加5行
# 4、/pattern1/ 正则表达式匹配的行
sed -n "/^root/p" file # 打印file文件中以root开头的行
# 5、/pattern1/,/pattern2/ 从匹配到pattern1的行,到匹配到pattern2
sed -n "/^ftpl,/^mail/p" file # 打印file文件中第一个匹配到以ftp开头的行,到第二个以mail开头的行
# 6、LineNumber ,lpattern1/  指定行号开始匹配,直到匹配到pattern1的行结束
sed -n "4, /^hdfs/p" file # 打印file文件中从第4行开始匹配,直到以hdfs开头的行结束
# 7、/pattern1/,LineNumber pattern1匹配的行开始,直到匹配到指定行结束
sed -n "/root/ ,10p" file # 打印file文件中匹配root的行,直到第10行结束

第三节 sed中的编辑命令详解

第四课 Shell脚本编程-sed用法_第3张图片第四课 Shell脚本编程-sed用法_第4张图片
| 常用匹配特殊字符:^$ 是空行[:blank:]是空格

  1. 查询: p 打印
  2. 删除: d 删除
  3. 增加:
    • a 配到的行后追加内容
    • i 匹配到的行前追加内容
    • r 将后面指定文件的内容追加到匹配到的行后面
    • w 将匹配到的行内容另存到其他文件中
  4. 修改:
    • s/pattern/string/ 查找并替换,查找符合pattern模式的字符串,将其替换为string 每行只替换第一个
    • s/pattern/string/g g表示全部行内全部匹配 全部替换
    • s/pattern/string/2g 2g表示, 从第二个root开始到剩下所有进行替换
    • s/pattern/string/ig 加i参数表示匹配时忽略大小写
  5. 其他编辑命令
    • = 显示行号
  6. 什么是反向引用?
    • &和\1 引用模式匹配到的整个串
    • sed "s/1..e/&r/g" file 在file中搜寻以1开头,然后跟两个任意字符,以e结尾的字符串
    • sed "s/\(1..e\)/\1r/g" file和上面实现一样的功能,使用\1代表搜寻到的字符串
    • 上面两种方式实现了一样的功能,分别使用&和\1引用前面匹配到的整个字符串
    • 两者区别在于&只能表示匹配到的完整字符串,只能引用整个字符串;而\1可以使用()对匹配到的字符
    • 例如:如果我们仅想要替换匹配到的字符串的一部分,name必须使用\1这种方式,不能使用&。如下
# 复制一个测试文件到当前目录
cp /etc/passwd ./
# 删除第一行 源文件不变
sed '1d' passwd
# 删除第一行 修改源文件
sed -i '1d' passwd
# 删除1-3行 修改源文件
sed -i '1, 3d' passwd
# 删除包含/sbin/nologin的行
sed -i '/\/sbin\/nologin/d' passwd
# 删除mail开头到ftp开头之间的行
sed -i '/^mail/,/^ftp/d' passwd
# 删除注释行和空行
sed -i '/^#/d;/^$/d' nginx.conf

# 匹配行后一行追加This is user which can login to system
sed -i '/\/bin\/bash/a This is user which can login to system' passwd
# 行前追加一行 AAAA
sed -i '/^sync/,/^sshd/i AAAAAA' passwd
# 新增辅助文件list.conf
First Line ( YYYYYYYYYYYYYY)
second Line (XXXXXXXXXXXX)
# 把上面辅助文件的内容加到匹配行后面
sed -i '/root/r list.conf' passwd
# 把匹配行保存到qi.txt文件中 
sed -n '/\/bin\/bash/w qi.txt' passwd

# 全部替换/bin/bash 为 /BIN/BASH
sed -i 's/\/bin\/bash/\/BIN\/BASH/g' passwd
# 包含root的行 只替换第一个root 
sed -i 's/root/ROOT/' passwd
# 包含root的行 从第二个root开始到剩下所有的root进行替换
sed -i 's/root/ROOT/2g' passwd
# 把所有root或者ROOT 都换成root
sed -i 's/root/ROOT/ig' passwd

# 显示符合条件的行号
sed -n '/\/sbin\/nologin/=' passwd

# 反向引用 str.txt
hadAAp is a bigdata frame
Spark hadBBp kafka
skill on hadCCp
Paper of hadDDp
Google hadEEp
# 反向引用 &表示前面匹配到的 ..是正则任意俩字符 
[root@localhost ~]# sed -i 's/had..p/&s/g' str.txt
[root@localhost ~]# cat str.txt
hadAAps is a bigdata frame
Spark hadBBps kafka
skill on hadCCps
Paper of hadDDps
Google hadEEps
# &和\1一样的效果 但是必须用() 比&更灵活
[root@localhost ~]# sed -i 's/\(had..p\)/\1O/g' str.txt
[root@localhost ~]# cat str.txt
hadAApOs is a bigdata frame
Spark hadBBpOs kafka
skill on hadCCpOs
Paper of hadDDpOs
Google hadEEpOs
# 比&更灵活 可以基于部分替换
[root@localhost ~]# sed -i 's/\(had\)...../\1doop/g' str.txt
[root@localhost ~]# cat str.txt
haddoop is a bigdata frame
Spark haddoop kafka
skill on haddoop
Paper of haddoop
Google haddoop
  1. sed中引用变量时注意事项:
    • 匹配模式中存在变量,则建议使用双引号
    • sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号
#!/bin/bash
#

old_str=hadoop
new_str=HADOOP
# 这里有变量 单引号不生效
# sed -i 's/$old_str/$new_str/g' str.txt
sed -i "s/$old_str/$new_str/g" str.txt
# 如果使用单引号 就这么用
sed -i 's/'$old_str'/'$new_str'/g' str.txt

你可能感兴趣的:(linux,运维,服务器)