day29学习笔记)(4月13日)
sed和正则表达式
sed是什么
sed是 Stream Editor (字符流编辑器)的缩写,简称流编辑器。
sed是操作、过滤和转换文本内容的强大工具。
sed的功能
- 常用功能包含正则表达式对文件实现快速增删改查
- 其中查询的功能中最常用的两大共功能是
- 过滤(过滤指定的字符串)
- 取行(区出指定的行)
sed命令执行过程
文字描述
sed 处理 文件 chaoge.txt
1.判断第一行是否要处理,不是就重新读取下一行;是则继续处理,流水线向后走;
2.数据放到了模式空间(内存),执行sed命令,如a追加、i插入、s替换
3.将模式空间内加工过的数据,输出到终端上,然后清空模式空间的内容;
4.继续处理下一行文本,重复上述流程,直到文件读取结束;
sed语法格式
sed [选项] [sed内置命令字符] [输入文件]
说明:
1.注意 sed 软件及后面选项,sed 命令和输入文件,每个元素之间都至少有一个空格
2.为了避免混淆,文本称呼sed为sed软件.sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的 options(选项)区分,故称为sed命令.
3.sed-commands 既可以是单个sed 命令,也可以是多个sed命令组合.
4.input-file(输入文件)是可选项,sed 还能够从标准输入或管道获取输入
sed软件的参数
options[选项]
解释说明
-n 取消默认的 sed 软件的输出,常与 sed 命令的 p 连用
-e 一行命令语句可以执行多条 sed 命令
-f 选项后面可以接 sed 脚本的文件名
-r 使用正则拓展表达式,默认情况 sed 只识别基本正则表达式
-i 直接修改文件内容,而不是输出终端,如果不使用-i 选项 sed 软件只是修改在 内存中的数据,并不影响磁盘上的文件
sed软件的命令
sed-commands[sed 命令]
解释说明
a 追加,在指定行后添加一行或多行文本
c 取代指定的行
d 删除指定的行
D 删除模式空间的部分内容,直到遇到换行符\n 结束操作,与多行模式相关
i 插入,在指定的行前添加一行或多行文本
h 把模式空间的内容复制到保持空间
H 把模式空间的内容追加到保持空间
g 把保持空间的内容复制到模式空间
G 把保持空间的内容追加到模式空间
x 交换模式空间和保持空间的内容
l 打印不可见的字符
n 清空模式空间,并读取下一行数据并追加到模式空间
N 不清空模式空间,并读取下一行数据并追加到模式空间
p 打印模式空间的内容,通常 p 会与选项-n 一起使用
P(大写) 打印模式空间的内容,直到遇到换行符\你结束操作
q 退出 sed
r 从指定文件读取数据
s 取代,s#old#new#g==>这里 g 是 s 命令的替代标志,注意和 g 命令区分
w 另存,把模式空间的内容保存到文件中
y 根据对应位置转换字符
:label 定义一个标签
t 如果前面的命令执行成功,那么就跳转到 t 指定的标签处,继续往下执行后 续命令,否则,仍然继续正常的执行流程
sed匹配文本范围
sed匹配文本范围
范围 | 解释 |
---|---|
空地址 | 全文处理 |
单地址 | 指定文件某一行 |
/pattern/ |
被模式匹配到的每一行 |
范围区间 | 10,20 十到二十行 ,10,+5第10行向下5行 ,/pattern1/,/pattern2/ |
步长 | 1~2,表示1、3、5、7、9行 ,2~2两个步长,表示2、4、6、8、10、偶数行 |
echo 追加多行数据
echo -e 参数
-e 允许对下面列出的加反斜线转义的字符进行解释.
\\
反斜线
\a
报警符(BEL)
\b
退格符
\c
禁止尾随的换行符
\f
换页符
\n
换行符
\r
回车符
\t
水平制表符
\v
纵向制表符
sed命令语法(记忆)
sed软件提供的命令很强大,刚开始到不用全部记住,以后逐步记忆即可,记住最常用的。
sed命令语法 | 作用 |
---|---|
3 | 操作第三行 |
3,6 | 操作3~6行,包括3和6行 |
3,+5 | 操作3到3+5(8)行,包括3,8行 |
1~2 | 步长为2,操作1,3,5,7..行 |
3,$ | 对3到末尾行操作,包括3行 |
/yuchao/ | 对匹配字符yuchao的喊该操作 |
/yuchao/,/chaoge/ | 对匹配字符yuchao到chaoge的行操作 |
/yuchao/,$ | 对匹配字符yuchao到结尾的行操作 |
/yuchao/,+2 | '/yuchao/,+2p',打印匹配到yuchao的行,包括其后2行 |
sed增加数据
sed增加字符命令
"a":追加文本到指定行,记忆方法:a 的全拼是 apend,,意思是追加
"i":插入文本到指定行前,记忆方法:i 的全拼是 insert,意思是插入
在文件第二行后添加数据
sed '2a 插入的内容' filename.txt
在第二行前,插入数据
sed '2i 插入的内容' filename.txt
sed '行号a 字符数据' 源文件
sed删除字符数据
d 删除指定的行
d 命令,表示删除字符,delete意思
sed默认是多行处理所有文本,如果不指定范围,sed默认是删除所有文本行数据
sed '行号 d命令' 文件
删除文件第2行
sed '2 d' filename.txt
删除1到3行
sed '1,3d' filename.txt
删除第1、2、4行
sed '1d;2d;4d' filename.txt
删除指定字符的行
sed '/指定字符/d' filename.txt
使用正则删除
sed '/a.*b/d' filename.txt
删除第二行到指定字符的行
sed '2,/指定字符/d' filename.txt
删除第3行到尾行
sed '3,$d' filename.txt
删除偶数行(步长)
sed '2~2d' filename.txt
删除奇数行(步长)
sed '1~2d' filename.txt
感叹号取反删除
sed '/yuchao/!d' chaoge.log
My name is yuchao.
My website is http://www.yuchaoit.cn
除了有字符yuchao的行,其他都删除
sed修改数据
c 把选定的行改为新的文本
把第二行替换成 I teach linux,python!
sed '2c I teach linux,python!' chaoge.log
sed替换的命令解释
语法:
sed 's/替换前字符/替换后字符/g' file
sed 's#替换前字符#替换后字符#g' file
sed 's@替换前字符@替换后字符@g' file
s 将每一行第一处匹配的字符替换 s/old_string/new_string/
g 全局替换global,每一行,每一处匹配的字符都替换 s/old_string/new_string/
-i 选项、参数,直接修改文件
sed默认是修改内存中的模式空间数据,不会修改源文件,使用-i会修改源文件,修改磁盘上的文件数据。
不加g只替换一次
sed 's#yuchao#老于#' chaoge.log
加上g,全局替换
sed 's#yuchao#老于#g' chaoge.log
指定行号修改
sed '3s#computer#电脑#g' chaoge.log
忽略大小写替换(i指令)
sed 's#my#his#gi' chaoge.log
分组替换
语法:
sed软件也提供了 \(\)分组功能
使用\1引用第一个括号的数据
\2引用第二个括号的数据
sed最多记住9个分组
sed与扩展正则
-r 使用sed -r参数才能支持扩展正则
-e 多次编辑,写入多次sed命令
以分组的方法提取ip地址
ifconfig ens33 | sed -rn '2s#.*inet (.*) netmask.*$#\1#pg'
以去头去尾的方法提取ip
ifconfig ens33 | sed -ne '2s#^.*inet\s##' -e '2s#netmask.*##p'
sed查询
sed打印命令p 打印sed正则处理后的数据
并且sed默认打印模式空间,可以用-n取消
固定用法,只要实用p,就是想输出指定数据,必然用-n取消默认打印
打印第二行
sed '2p' file
打印第1到第4行
sed '1,4p' file
过滤字符串打印
sed '/qq/p' file #打印有qq的行
指定行到指定字符串区间
sed '3,/http/p' -n file #如果没匹配到http字符,依然会向后打印
找出http或linux的行
sed '/http|linux/p' -n file
找出http到linux的行
sed '/http/,/linux/p' -n file
w命令,将sed操作结果,写入到指定文件中
sed '/linux/w linux.log' chaoge.log -n
替换文件中所有的yuchao为老于,新内容写入到yu.log
sed 's#yuchao#老于#gw yu.log' chaoge.log -n