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的更多相关文章

  1. bash编程之多分支if 语句及for循环

    第十七章.bash编程之多分支if 语句及for循环 if语句三种格式 多分支if语句练习 for循环 17.1.if语句的三种格式 单分支if语句 if condition;then 条件为真执行的 ...

  2. bash编程总结

    bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...

  3. [shell] Bash编程总结

    由于工作需要,之前的几个月写了一些Bash脚本,主要完成自动测试.打包.安装包等.虽然相比C++编程,要简单.傻瓜,但其在类Unix系统中可以大大提高工作的效率.所以在此对脚本编程过程中一些注意事项进 ...

  4. Linux Bash编程

    在Linux系统介绍中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash ...

  5. Linux中bash编程

    bash编程也叫shell编程 预定义变量         $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...

  6. bash编程基础

    bash变量 变量命名: 1.不能使用程序中的关键字(保留字) 2.只能使用数字.字母和下划线,且不能以数字开头 3.要见名知义 变量类型: 数值型:精确数值(整数),近似数值(浮点型) 字符型:ch ...

  7. bash编程之循环控制:

    bash编程之循环控制: for varName in LIST; do 循环体 done   while CONDITION; do 循环体 done   until CONDITION; do 循 ...

  8. bash编程的信号捕获:

    bash编程的信号捕获: kill -l KILL无法捕捉:   trap 'COMMAND' SIGNAL,    信号捕捉用于:在中途中止时做一些清理操作.   一. trap捕捉到信号之后,可以 ...

  9. 怎样用 Bash 编程:逻辑操作符和 shell 扩展

    学习逻辑操作符和 shell 扩展,本文是三篇 Bash 编程系列的第二篇. Bash 是一种强大的编程语言,完美契合命令行和 shell 脚本.本系列(三篇文章,基于我的 三集 Linux 自学课程 ...

随机推荐

  1. ubuntu 16.04 安装中文语言包

    安装中文语言包 sudo apt-get install  language-pack-zh-han* 安装gnome包 sudo apt-get install   language-pack-gn ...

  2. IDEA常用快捷键,收藏以备后用

    IntelliJ Idea 常用快捷键列表 Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Sh ...

  3. canvas 2.0 图片绘制

    绘制图片drawImage 2013.02.21 by 十年灯·一条评论 本文属于<html5 Canvas画图系列教程> 这里的绘制图片是指把一张现成的图片,绘制到Canvas上面. 有 ...

  4. xcode 自动签名原理

    签名的核心就是provision profile要与当前的bundle id及本地的私钥相匹配. teamid:每个开发者账号都会对应一个teamid.企业的开发这账号除了对应一个teamid外,下面 ...

  5. python学习记录

    学习python中······· 今天写了个装饰器用来登录用,用户名和密码是存在文件里的,涉及到了装饰器和带参数的装饰器 文件里的内容如下 {"liming": 123456} { ...

  6. JAVA算术运算符

    算术运算符 +.-.*(乘号)./(除号,取商).%(取余数.取模) 特殊的运算符:++(加加).--(减减) int  a = 1; a+=10;  等同于a=a+10; a-=5;   等同于a= ...

  7. eclipse修改工作目录颜色

    转载请注明本地址,http://blog.csdn.net/u013173247/article/details/41676495 经常用Eclipse的朋友都应该清楚,Eclipse的白背景不知道晃 ...

  8. 使用jmail发送短信

    原文链接 https://blog.csdn.net/sdaujsj1/article/details/79248469 pom <!-- https://mvnrepository.com/a ...

  9. ios 在使用 SDWebimage UIButton setBackgroundimage

    解决方法 : 有法为此在 SDWebImage: SDWebImage / SDWebImage / UIButton+WebCache.h 导入此文件在您的类: #import <SDWebI ...

  10. 对hadoop namenode -format执行过程的探究

      引言 本文出于一个疑问:hadoop namenode -format到底在我的linux系统里面做了些什么? 步骤 第1个文件bin/hadoop Hadoop脚本位于hadoop根目录下的bi ...