文本三剑客:都是按行读取后处理。
grep 过滤行内容
awk 过滤字段
sed 过滤行内容;修改行内容
sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中
sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等
sed编辑器的工作流程
sed 的工作流程主要包括读取、执行和显示三个过程:
读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )。
执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行, 除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流(屏幕)。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上.述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,
除非是用重定向存储输出或者sed -i.
sed命令格式
sed -e '操作' 文件1 文件2..
sed -n -e '操作1;操作2' 文件1 文件2 ..
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
sed -e 'n {
操作1
操作2
}' 文件1 文件2 ...
常用选项
选项 | 作用 |
-e 或--expression= | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f 或--file= | 表示用指定的脚本文件来处理输入的文本文件 |
-h或--help | 显示帮助 |
-n、--quiet或silent | 禁止sed编辑器输出,但可以与p命令一起使用完成输出 |
-r | sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法) |
-i | 直接修改目标文本文件 |
常用操作
操作 | 作用 |
s | 替换,替换指定字符 |
d | 删除,删除选定的行 |
a | 增加,在当前行下面增加一行指定内容 |
i | 插入,在选定行上面插入一行指定内容 |
c | 替换,将选定行替换为指定内容 |
y | 字符转换,转换前后的字符长度必须相同 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。 |
= | 打印行号 |
l(小写l) | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
sed -p 打印
sed -n:禁止sed编辑器输出
操作‘=’:打印行号
操作 ‘l’:打印数据流中的文本和不可打印的ASCII字符
sed -e 多个操作
sed -n -e '命令1' -e '命令2' 文件
或者
sed -n -e '命令1;命令2' 文件
或者
sed -n '
命令1
命令2
....
' 文件
也可以合并
或者使用换行打印文件内容
sed对指定行进行操作
以数字形式表示行区间
用文本模式(字符串)来过滤出行(一般结合正则表达式)以数字形式表示行区间
操作 | 含义 |
---|---|
'1p' | 打印第一行 |
'$p' | 打印最后一行 |
'1,3p' | 打印连续行,打印第一行到第三行 |
'6,$p' | 打印第六行到最后一行 |
'1,+3p' | 打印第一行加后面三行(即打印第一到第四行) |
'5q' | 打印前五行后退出 |
'p;n' | 打印奇数行 |
'n;p' | 打印偶数行 |
使用字符串匹配出行:
操作 | 含义 |
'/root/p' | 打印包含root的行 |
'/root/!p' | 打印不包含root的行。! 表示取反 |
'/^root/p' | 打印以root开头的行 |
'/bash$/' | 打印以bash结尾的行 |
'/root l bash/p' | 打印包含root或bash的行。"l"是扩展正则表达式的元字符,要使用sed -r |
'6,/root/p' | 打印第6行到第一个包含root的行 |
以数字形式表示行区间
打印单行
打印连续的行
打印第一行和后面3行 (1-4)
打印第1-5行的方法
还有一种也能算是
使用sed输出奇数行或者偶数行
打印除了第一行以外的奇数行
使用正则表达式,匹配行内容
注意:sed 使用扩展正则表达式时,要加 -r
sed -r 支持扩展正则表达式,同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\
删除指定行
sed 'd'
sed '/#/,/@/d' 文件名
sed会读取每行的内容,从第一个位置#打开删除功能,到第二位置@删完后关闭删除功能,再继续查询与 #和@匹配的行 进行删除 一直重复此操作
替换
字符串
行范围 s/旧字符串/新字符串/替换标记
替换标记
替换标记 | 作用 |
数字 | 表明新字符串将替换第几处匹配的地方 |
g | 表明新字符串将会替换所有匹配的地方 |
p | 打印与替换命令匹配的行,与-n一起使用 |
w文件 | 将替换的结果写到文件中 |
sed -g
sed -s
替换命令的分隔符看 s后面跟的字符,3个分隔符要保持一致,如果遇到跟分隔符相同的字符则需要使用"\"来转义
将/bin/bash 转换为 /sbin/nologin
因为替换的格式为 s/旧/新 此处的"/"为分隔符 但是/bin/bash与/sbin/nologin中的"/"为根,容易引起歧义
可以使用"\"转义字符将"/"转义为普通字符
或者使用其他字符作为分隔符,且所有分隔符保持一致(s后面的内容就是分隔符)
注释行内容
将root开头的行进行注释(在开头加上#)
在包含root的行的行尾加上#
删除
整行替换
使用c进行替换,是对整行内容进行替换
sed '#c 新内容 文件名 #替换第#行的全部内容
或者
sed '/旧内容/c 新内容' 文件名 #将被筛选到(含有旧内容)的行替换为新内容
单字符替换 y
使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换,前后字符串长度需要一致,不然会报错
增加(插入)内容
行前插入
在行后插入内容
插入文件内容
剪切粘贴
调换顺序