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. PyQt5 入门

    换了VSCODE开发,感觉比sublime好点,可能是由于第三版老弹框烦人吧.VSCODE看着也挺好看的. 学习 PyQt5 中文教程 0. 安装完之后错误 pip 安装了 pyqt5 from Py ...

  2. leetcode141

    /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...

  3. mongodb相关文章

    1.Windows 平台安装 MongoDB 2.MONGODB基本命令用 3.MongoDB 教程

  4. A bean with that name has already been defined in DataSourceConfiguration$Hikari.class

    A bean with that name has already been defined in DataSourceConfiguration$Hikari.class 构建springcloud ...

  5. R语言-图的要素颜色

    1.设置图形要素的颜色 Plot函数中,使用col=参数来决定要素的颜色 如果不指定plot type,颜色加在散点上,如果指定了plot type,例如line,则颜色加在线上 其它函数,例如bar ...

  6. db2常见命令

    增加db2top命令的refresh间隔,默认值为2秒,下面的命令就可以每10秒刷新一次: $ db2top -i 10 -d sample 数据库本身太繁忙(dynamic SQL过多).建议增加 ...

  7. H5相关网址

    html5中国 http://www.html5cn.org/   HTML 5 教程 http://www.w3school.com.cn/html5/index.asp   http://www. ...

  8. 【测试工具】Macaca 自动遍历器 NoSmoke

    Macaca 提供的基础能力上研发出了一套多端深度遍历爬虫工具. 希望可以最大化减少UI 测试脚本的编写涵盖以下功能点: 支持iOS, Android,PC-Web 三个平台的自动化测试 同时可以通过 ...

  9. C#Winform的DEV下拉下拉控件介绍

    LookupEdit 下拉单选,可搜索,下拉展示为一个table: ComboxEdit 下拉单选,可当做text使用,输入数据源中没有的项,只有显示值: CheckcomboxEdit 下拉多选,可 ...

  10. IPV4/IPV6双协议栈配置案例

    拓扑: XRV1配置: =================================================================== hostname XRV1! ipv6 ...