sed命令

sed参数命令说明

sed是字符流编辑器,文件数据像流水线被处理加工

功能

sed 命令是操作,过滤和转换文本内容的强大工具

  • 常用功能有增删改查(增加,删除,修改,查询
  • 其中查询的功能最常用的
  • 另外两大功能
    • 过滤(过滤指定字符串)
    • 取行(去除指定行).

参数

-n 取消默认的sed软件的输出 常与 sed 命令 的p连用
-e 一行命令语句可以执行多条sed命令
-f 选项后面可以接sed脚本的文件名
-r 使用正则扩展表达式 默认情况下sed只识别基本正则表达式
-i 直接修改文件内容,而不是输出终端,如果不适用-i 选项 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匹配范围

匹配文本范围

范围 解释
空地址 全文处理
单地址 指定文件某一行
/pattern/ 被模式匹配到的每一行
范围区间 10,20 十到二十行10,+5第10行向下5行/pattern1/,/pattern2/
步长 1~2,表示1、3、5、7、9行2~2两个步长,表示2、4、6、8、10、偶数行

范围表达

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/,/chaoge/ 对匹配字符yuchao到chaoge的行操作
/yuchao/,$ 对匹配字符yuchao到结尾的行操作
/yuchao/,+2 '/yuchao/,+2p',打印匹配到yuchao的行,包括其后2行

命令操作

追加操作

* 增表示在指定的行与行之间 添加新的字符数据
"a":追加文本到指定行,记忆方法:a 的全拼是 apend,,意思是追加 
"i":插入文本到指定行前,记忆方法:i 的全拼是 insert,意思是插入
 \n 多行添加
sed -i '2a This is vory good'  文件
sed -i '2i THIE tai bei ' 文件
sed -i '3a This my is sjog \n THis his is opppen' 文件
# 语法 sed '行号a 字符数据' 源文件 sed '行号i 字符数据' 源文件
每一行下面添加一行
sed -i 'a heheihei' stude.txt

删除操作

1 删除1,2,4行
# 语法是用分号隔开多个命令
sed -i '1d;2d;4d' 文件

2 删除字符串的行
sed -i '/game/d'  文件

3 集合正则
#sed -i '/g.*e/d;/h*p/d'

4 感叹号取反
sed -i '/yuchao/!d' 文件

单引号,双引号,无引号,反引号

单引号所见即所得,单引号内的内容会原样输出,结合sed能识别单引号中的正则表达式符号

双引号也是输出引号内的字符串,双引号会把变量,命令等先解析出结构,然后在输出最终内容

查询输出

sed 打印命令p 打印sed正则处理后的数据,并且sed默认打印模式空间,可以使用 -n 参数取消。
*固定用法只要使用p 就是想输出指定数据必然 用-n取消默认打印
ip add | sed -n '/^3/p'

使用q命令,实现head命令的作用,提取文件前几行数据

sed 替换操作

替换整行命令 c

# 语法
sed -i '行号c替换内容' 文件

替换具体内容命令s操作

命令格式:
sed  [options]   [sed-commands]       [input-file]
sed   [选项]       [sed命令]          [输入文件]

选项:
-n 取消默认的sed输出,常与sed命令的p连用
-r 使用拓展正则
-i 将修改结果写入文件
-e 多个sed命令操作 

命令: sed -n '15,24p' test1.txt   命令式在 '' 对行号,正则表达式//操作命令
p  输出处理过的行
a  append 追加
i  insert 插入
d  删除
;  命令分隔;执行多条命令

替换符-前面:
Ns 只替换第几行 如3s###
s  替换模式 s###
c  替换指定行的内容

标识符-后面: (标识符为//或##替换操作中)
g  全局替换
N  每行第几次匹配的对象
空 只匹配第一次内容
i  忽略大小写匹配

# 替换格式 全部替换使用 g 替换操作可以选取匹配到的替换字符 比如第一个或第二个 在最后标识符 标记次数 's#替换关键词#替换后的内容#2'
命令格式:
sed 's#替换关键词#替换后的内容#g' chaoge.log

分组替换

语法:
sed软件也提供了 \(\)分组功能
使用\1引用第一个括号的数据
\2引用第二个括号的数据
sed最多记住9个分组

sed与扩展正则表达式

sed -r参数,识别扩展正则;\s 表示单个空格;-e 多次编辑,写入多次sed命令

操作习题总结

# sed一般来说 范围查找 在命令操作中'' 用 , 分隔行号,要是需要使用正则 表达式在 //写 ; 添加多行 在添加文本之间添加换行符 \n
# 操作范围 连续的行数操作 在行号间 使用逗号 , 多个行操作使用冒号 ; 隔行操作使用~ 1~2 隔1行操作
1 查找包含love后Linux的行 使用扩展-E 整体字符使用()
#sed -rn '/(love|linux)/p' file.txt
#sed -rn '/love|linux/p' file.txt

*替换操作sed -n 's#I#我#gp' file.txt 
1 将第二次匹配的上的a替换为A
sed -n 's#a#A#2p' file.txt

2 删除字符串game行之后的2行
sed '/game/,+2d' file.txt

3 取反删除只保留1和2行
sed -r '1,2!d' file.txt

4 提取ip地址  分组提取法sed是对文本像流水线一样处理,分组就是通过对处理的文本流 截取的字符两边特点进行截取 并提取替换输出
ifconfig eth0 | sed -nr 's#.*inet\s(.*)\snetmask.*#\1#p'
 掐头去尾 对提取的字符两边内容进行替换达到删除效果
 ifconfig eth0 | sed -nr -e '2s#.*et\s##' -e 's#\snet.*##p'
 
 5 修改DNS 分组法 
 sed -rn '2s#(.*)\s2.*#\1 8.8.8.8#p' resolv.conf 
 
 6 提取系统所有用户名 
 cat /etc/passwd |sed -rn 's#(.*):(.*):(.*):(.*):(.*):(.*):(.*)#\1#p'
 # 把用户名后:所有字符替换掉
 sed 's#:.*##p' /etc/passwd -n
 # 分组法()使用.*注意边界值
 #sed -rn 's#(.*):x.*#\1#p' /etc/passwd
 
 7 提取用户名和uid和gid
 sed -rn 's#(.*):.*:(.*):(.*):.*:.*:.*#\1,\2,\3#p' /etc/passwd
 # 通过正则[]任意字符 成组() 多位数+ 进行组合 提取用户名和uid,gid
 sed -rn 's#([0-9a-zA-Z]+):.*:([0-9]+):([0-9]+):.*#\1,\2,\3#p' /etc/passwd
 
 8 通过[]与()结合扩展正则提取ip地址#
 sed -nr 's#^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3}).*#\1.\2.\3.\4#p' ngin.log
posted @ 2026-01-28 15:20  Dswtao  阅读(4)  评论(0)    收藏  举报