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 自学课程 ...
随机推荐
- leetcode236
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { ...
- 2Linux常用命令-Liunu就该这么学
常用系统工作命令 1.echo 用于在终端输出字符串或变量提取后的值,格式为“echo [字符串 | $变量]” 2.date date "+%Y-%m-%d %H:%M:%S" ...
- C# 委托和泛型
委托定义: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有 ...
- django 数据库查询的几个知识点
django查询db过程中遇到的几个问题: 1. 数据库切换,用using products = models.TProductCredit.objects.using(') 2.查询结构集是Quer ...
- win2012R2打Windows8.1-KB2919355 问题
解决方法 https://blog.csdn.net/qwq1503/article/details/65916426
- python入门学习0
Python 是什么类型的语言 Python是脚本语言 Python下载地址:https://www.python.org/downloads/ Python版本:Python 3.4.2 - 64b ...
- mysql简单介绍及安装
MySQL是一个关系型数据库管理系统关系数据库,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性,所使用的 SQL 语言是用于访问数据库的最常用标准化语言.My ...
- [Ting's笔记Day5]在部署到Heroku之前,将Rails项目从SQLite设定为PostgreSQL
前情提要: Paas(平台及服务)公司Heroku是个可以把我们写好的App部署到网际网络的好地方.而本篇是我从自己的上一篇文章:将Ruby on Rails项目部署到Heroku遇到的问题,当时困扰 ...
- 查找单链表中倒数第K个位置上的结点,若查找成功返回该节点的data域,若不成功只返回0
算法的基本设计思想:定义两个指针变量p和q 初始时均指向头结点的下一个结点(即链表的第一个结点)p沿链表移动,当p移动到第k个结点时,q指针开始与p指针同时移动,当p指针移动到最后一个结点时,q指针 ...
- C语言冷知识
C语言属强类型语言(1)编程语言分2种:强类型语言和弱类型语言.强类型语言中所有的变量都有自己固定的类型,这个类型有固定的内存占用,有固定的解析方法:弱类型语言中没有类型的概念,所有变量全都是一个类型 ...