sed(stream editor)流编辑器,以行为单位处理文本(处理: 增加 删除 修改 查询)
sed [options] "pattern cmd" file
- 一次从输入中读取一行
- 根据所提供的命令匹配数据
- 按照命令修改流中的数据
- 将新的数据输出到STDOUT
cmd
命令 = 显示行号
替换
sed 's/dog/cat/' data.txt
# 文件中的dog替换为cat,只替换第一个
-e 执行多个命令
sed -e 's/brown/green/; s/dog/cat/' data.txt
-f 从文件读取编辑器命令
sed -f script.sed data.txt
#script.sed文件
s/brown/green/
s/fox/elephant/
s/dog/cat/
标记替换
sed ‘s/test/trial/2’ data.txt #替换第二个
sed ‘s/test/trial/g’ data.txt #替换所有
sed ‘s/test/trial/p’ data.txt #打印替换后的行的内容
sed ‘s/test/trial/w test.txt’ data.txt #将替换的行的内容保存到指定文件
sed ‘s!/bin/bash!/bin/csh!’ /etc/passwd # 使用!做替换分割
反向引用
sed 's/had..p/&s/g' data.txt
# &表示前边匹配到的 引用
& 或者 \1 都表示反向引用
sed 's/\(had..p\)/\1s/g' data.txt
# \1 表示前边匹配到的 引用 括号中内容
sed 's/\(had\)...../\1oop/g' data.txt
# \1 表示前边匹配到的 引用 括号中内容
匹配模式中存在变量建议使用""
#!/bin/bash
old=aa
new=bb
sed -i "s/$old/$new/" data.txt
#或者
sed -i 's/'$old'/'$new'/' data.txt
使用地址范围
sed ‘2s/dog/cat/’ data.txt
sed ‘2,3s/dog/cat/’ data.txt
sed ‘2,$s/dog/cat/’ data.txt
sed '2,${
s/brown/green/
s/lazy/active/
}' data.txt
使用文本过滤
sed ‘/ming/s/bash/csh/’ /etc/passwd #替换含ming的行
删除行
sed ‘3d’ data.txt #删除3行
sed ‘2,3d’ data.txt #删除2-3行
sed ‘/pattern/d’ data.txt #删除含pattern行
添加行
#append / insert
i, 指定行之前插入新行
a, 指定行之后附加新行,这两个命令必须单独指定要插入或附加的行
echo "new line" | sed 'i\line1'
echo "new line" | sed 'a\line1'
sed '/pattern/a This is append context' data.txt
修改
sed ‘3c\this is changed new line’ data.txt #修改第三行
sed ‘/number 3/c\this is changed new line’ data.txt #匹配number 3
sed ‘2,3c\this is changed new line’ data.txt #用这一行替代原来的2 3 两行内容,而不是逐一修改
转换
sed ‘y/123/789/’ data.txt
echo “this 1 is a test of 1 try” | sed ‘y/123/456/’
this 4 is a test of 4 try #输出
写入文件
w filename
sed ‘1,2w test.txt’ data.txt # 将data的前2行写入test.txt
sed ‘3r new.txt’ data.txt #从第三行开始插入new.txt内容
回顾打印
echo “hello” | sed ‘p’
sed -n ‘2,10p’ data.txt
-n选项:只显示匹配处理的行(否则会输出所有)(也就是关闭默认的输出)
通常 p 会与参数 sed -n 一起运行
支持扩展正则
sed 文本工具支持:BREs( 基本的正则)、EREs(扩展正则)
sed 指令默认是使用"BREs"
sed 命令参数 “-r ” ,则表示要使用“EREs"
awk 指令默认是使用 “EREs"
linux shell 正则表达式(BREs,EREs,PREs)差异比较
-r 支持扩展正则
sed -n -r '/python|PYTHON/p' data.txt
# 或| 就是扩展正则
-i 直接修改文件内容
sed -n 's/love/like/g;p' data.txt
#替换 ;print
高级用法
处理多行的命令
- N 将数据流中的下一行加进来 创建一个多行组
- D 删除多行组中的一行
- P 打印多行组中的一行
next
sed '/pattern/{n;d}' data.txt
#找到有pattern的一行,然后n 让sed移动到下一行 然后删除
sed '/pattern/{N; s/\n/ /}' data.txt
# 找到pattern的一行, 然后把该行的换行符替换成空格;
sed 'N; s/System.Addmin/desk user/' data.txt
#可以匹配pattern在两行的情况,中间的. 是通配符
sed 'N; /System\nAdmin/d' data.txt
#会删除匹配到的两行
sed 'N; /System\nAdmin/D' data.txt
#删除第一行
sed 'N; /System\nAdmin/P' data.txt
#打印匹配的第一行
保持空间
//挖坑
排除命令
sed -n '/pattern/p' data.txt
#不打印有pattern的行
sed '$!N s/System Admin/desk user/' data.txt
#$表示最后一行,最后一行不会做多行处理,N对遇最后一行不起作用;
分支
[address]b [label] #label决定要跳转位置,没有则到结尾;
sed '{2,3b; s/This is/Is this/; s/line./test?/}' data.txt
#两个替换命令都不对2-3行起作用
测试
t # 类似if then
如果替换命令成功,测试命令就会跳到指定标签;否则不会跳转;
添加行号
sed '=' data.txt | sed 'N; s/\n/ /'
#添加行号
examples
利用sed查找文件内容b站
P7-P8
get_all_segments 是一个函数名,返回的是一个列表, 用`get_all_segments` 引用
例子2:
^[^#] 解释: ^开头 [^#] 非#号
#3.(3) 少了ftp