bash编程-sed
sed(Stream Editor)是Linux系统下的一个文本流编辑器,它将文本文件内容逐行读取到标准输出,并将此行内容写入模式空间(pattern space),然后按照给定的地址定界和命令处理匹配到的行,处理后的内容交给标准输出。
sed除了模式空间,还能够操作保持空间,保持空间可以理解为类似剪切板的一个暂存区域,模式空间和保持空间之间的内容都可以进行追加、覆盖等操作,两个内存空间结合使用可以实现各种强大的文本处理。
sed工具的处理操作不会修改原文件,除非使用了-i选项或输出从定向指定输出到文件。
SYNOPSIS
sed [options] 'script' file...
OPTIONS
-n:仅显示script处理后的结果;
-e script, --expression=script:连接多个script(每个script前都要加-e);
-f script-file:从文件中读取script
-r, --regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;
-h:显示帮助
SCRIPT
sed命令中的script包行两部分:地址定界和编辑命令,地址定界用于指定需要处理的行,并且可以匹配模式(pattern);编辑命令用于指定对匹配到的内容作何处理,如输出、替换、删除等等。
# 地址定界
(1) 空地址(即编辑命令前没有指定地址定界):对全文进行处理;
(2) 单地址:
n:第n行;
/pattern/:被此模式所匹配到的每一行;
$:最后一行;
(3) 地址范围
m,n:第m行至第n行;
m,+n:第m行向后n行;
n,/pattern/:第n行至第一次匹配到模式的行;
/pat1/,/pat2/:第一次匹配到两个模式的行之间的行
(4) 步进:~
m~n:第m行开始,每隔n行
1~2:1,3,5,7...行,即所有奇数行
2~2:2,4,6,8...行,即所有偶数行
# 编辑命令(多个命令可以用;分隔表示依次执行多个命令)
d:删除;
p:输出;
a \text:在行后面追加文本“text”,支持使用\n实现多行追加;
i \text:在行前面插入文本“text”,支持使用\n实现多行插入;
c \text:将匹配到的行替换为指定的文本“text”;
w filename:保存模式空间匹配到的行至指定的文件中;
W filename:保存模式空间匹配到的第一行至指定的文件中;
r filenem:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;
=:为模式匹配到的行打印行号;
!:地址定界条件取反(用在地址定界之后:地址定界!编辑命令);
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;
【替换标记】
g:全局替换;
w filename:将替换成功的结果保存至指定文件中;
p:显示替换成功的行;
# 高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中;
H:把模式空间中的内容追加至保持空间中;
g:把保持空间中的内容覆盖至模式空间中;
G:把保持空间中的内容追加至模式空间中;
x:把模式空间中的内容与保持空间中的内容互换;
n:覆盖读取匹配到的行的下一行至模式空间中;
N:追加读取匹配到的行的下一行至模式空间中;
d:删除模式空间中的行;
D:删除多行模式空间中的所有行;
示例
# 1.准备测试的文本文件
[root@VM_41_201_centos ~]# cat << EOF > /tmp/sed.test
A.这是第1行AA
B.这是第2行BB
C.这是第3行CC
D.这是第4行DD
E.这是第5行EE
F.这是第6行FF
EOF
# 2.输出第4行至最后一行(未使用-n:原文件所有内容会输出,指定的行会再次输出)
[root@VM_41_201_centos ~]# sed '4,$p' /tmp/sed.test
A.这是第1行AA
B.这是第2行BB
C.这是第3行CC
D.这是第4行DD
D.这是第4行DD
E.这是第5行EE
E.这是第5行EE
F.这是第6行FF
F.这是第6行FF
# 3.输出第4行至最后一行(使用-n:原文件内容不会输出,仅输出指定的最后一行)
[root@VM_41_201_centos ~]# sed -n '4,$p' /tmp/sed.test
D.这是第4行DD
E.这是第5行EE
F.这是第6行FF
# 4.删除第2行及后3行
[root@VM_41_201_centos ~]# sed '2,+3d' /tmp/sed.test
A.这是第1行AA
F.这是第6行FF
# 5.在以EE结尾的行前插入@@,在以DD结尾的行后追加$$
[root@VM_41_201_centos ~]# sed -e '/EE$/i\@@' -e '/^D/a\$$' /tmp/sed.test
A.这是第1行AA
B.这是第2行BB
C.这是第3行CC
D.这是第4行DD
$$
@@
E.这是第5行EE
F.这是第6行FF
# 6.替换行中第一个匹配的字符
[root@VM_41_201_centos ~]# sed 's/[ABCDEF]//' /tmp/sed.test
.这是第1行AA
.这是第2行BB
.这是第3行CC
.这是第4行DD
.这是第5行EE
.这是第6行FF
# 7.替换行中所有匹配到的字符
[root@VM_41_201_centos ~]# sed 's/[ABCDEF]//g' /tmp/sed.test
.这是第1行
.这是第2行
.这是第3行
.这是第4行
.这是第5行
.这是第6行
# 8.pattern中包含变量时,''需要换成"",并且""中的特殊字符需要转义
[root@VM_41_201_centos ~]# line=3
[root@VM_41_201_centos ~]# echo $line
3
[root@VM_41_201_centos ~]# sed '$line,\$d' /tmp/sed.test
sed:-e 表达式 #1,字符 3:命令后含有多余的字符
[root@VM_41_201_centos ~]# sed "$line,\$d" /tmp/sed.test
A.这是第1行AA
B.这是第2行BB
# 9.显示奇数行
[root@VM_41_201_centos ~]# sed 'n;d' /tmp/sed.test
A.这是第1行AA
C.这是第3行CC
E.这是第5行EE
# 10.显示偶数行
[root@VM_41_201_centos ~]# sed -n 'n;p' /tmp/sed.test
B.这是第2行BB
D.这是第4行DD
F.这是第6行FF
# 11.显示最后2行
[root@VM_41_201_centos ~]# sed '$!N;$!D' /tmp/sed.test
E.这是第5行EE
F.这是第6行FF
# 12.删除原有空白行,并在所有非空白行后添加空白行
[root@VM_41_201_centos ~]# sed '/^$/d;G' /tmp/sed.test
A.这是第1行AA
B.这是第2行BB
C.这是第3行CC
D.这是第4行DD
E.这是第5行EE
F.这是第6行FF
[root@VM_41_201_centos ~]#
# 13.使用保持空间+多个编辑命令实现逆序显示
[root@VM_41_201_centos ~]# sed '1!G;h;$!d' /tmp/sed.test
F.这是第6行FF
E.这是第5行EE
D.这是第4行DD
C.这是第3行CC
B.这是第2行BB
A.这是第1行AA
bash编程-sed的更多相关文章
- bash编程之多分支if 语句及for循环
第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...
- bash编程总结
bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...
- [shell] Bash编程总结
由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...
- Linux Bash编程
在Linux系统介绍中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash ...
- Linux中bash编程
bash编程也叫shell编程 预定义变量 $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...
- bash编程基础
bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...
- bash编程之循环控制:
bash编程之循环控制: for varName in LIST; do 循环体 done while CONDITION; do 循环体 done until CONDITION; do 循 ...
- bash编程的信号捕获:
bash编程的信号捕获: kill -l KILL无法捕捉: trap 'COMMAND' SIGNAL, 信号捕捉用于:在中途中止时做一些清理操作. 一. trap捕捉到信号之后,可以 ...
- 怎样用 Bash 编程:逻辑操作符和 shell 扩展
学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...
随机推荐
- itextsharp图片生成pdf模糊问题解释
I forget to mention that I' am using itextsharp 5.0.2. It turned out that PDF DPI = 110, which means ...
- python print格式化输出。
python print格式化输出. 1. 打印字符串 print ("His name is %s"%("Aviad")) 效果: 2.打印整数 print ...
- kill all java php rm.sh
#!/bin/sh#根据进程名杀死进程#FileName: killjavaphprm.sh #查看php进程IDecho "php进程ID:"pgrep php #杀死所有php ...
- 2017-11-03 Fr OCT 球体积的导数为球表面积
上学期学立体几何时注意到这一点.去问林老师,没听明白(写完笔记后发现林老师讲得是对的,惭愧).今天下午考历史的时候突然想起来. 除了球体积的导数为球表面积外,还注意到圆体积的导数为圆周长.今天中午看w ...
- <转>ajax 同步异步问题
原文:https://blog.csdn.net/wxr15732623310/article/details/76387787 看似简单明白的问题说起来却迷迷糊糊,完全没有逻辑,说不到重点上,再来整 ...
- 大数据入门到精通7--对复合value做reducebykey
培训系列7--对复合value做reduce 1.做基础数据准备 val collegesRdd= sc.textFile("/user/hdfs/CollegeNavigator.csv& ...
- Python设计模式 - UML - 包图(Package Diagram)
简介 包图是对各个包及包之间关系的描述,展现系统中模块与模块之间的依赖关系.一个包图可以由任何一种UML图组成,可容纳的元素有类.接口.组件.用例和其他包等.包是UML中非常常用的元素,主要作用是分类 ...
- H5滑条(input type=range)
input[type=range] { -webkit-appearance: none; width: 230px; border-radius: 10px; /*这个属性设置使填充进度条时的图形为 ...
- 【python深入】单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. 比如,某 ...
- sqlserver2017 重装过程中出现“无法找到数据库引擎启动句柄”错误的解决办法
sqlserver数据库引擎修改账号名,详情参考:http://blog.51cto.com/djclouds/2089047?utm_source=oschina-app 在SQL Server安装 ...