sed 的详细用法

sed:stream editor 流编辑器
sed的工作模式;sed是一个行文本编辑器,默认每次处理文本中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把模式空间
里面的内容实现在屏幕上,然后把模式空间的中的内容删除,同时把下一行所匹配到内容读入模式空间

为了下面演示方便,我们创建一个文本文件a.text

#cat a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy

sed 命令的语法格式:

sed [options] 'addresscommand' file (1)
sed [options] -f scriptfile file (2)

(2)是sed的脚本用法后面会介绍到
先介绍语法(1)种用法:**


address(匹配的条件)的表示法:

linenumber:指定特定行号
startline,endline:指定起始行号,和结束行号
linenumber,+N :N数字,表示从指定行号向后N行
/patten/:以正则表达式的匹配模式
/patten1/,/patten2/:从模式匹配1到模式匹配2


options:选项

-n 静默模式 常使用p命令时会用
-i 改变原文件
-f file 跟脚本文件
-e 可以执行多个命令语句


command:命令(简单用法)

p:打印模式空间中行
d:删除,删除选择的行
r file:读取file中的内容追加到匹配的行后面
R file:读取file中的内容的第一行追加到匹配行的后面
w file:将匹配到的行,保存到file中
W file:将匹配到的行的第一行,保存到file中
a \string 在当前行下面插入文本。
i \string 在当前行上面插入文本。
! 表示后面的命令对所有没有被选定的行发生作用.
y 和s用法类似,但只能替换大小写
s/patten/string/ 把patten匹配到的换成string字符


sed替换标记:

g表示全局替换
\1表示前面第一个左括号所表示的内容,\2表示前面第二个左括号中表示的内容,以此类推
&表示前面匹配到的内容


sed 元字符

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

  • 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
    (..) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
    & 保存搜索字符用来替换其他字符,如s/love/&/,love这成love
    \< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。
    \> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。
    x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
    x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
    x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

下面我们看例子:

address 匹配条件的用法

1,只显示a.text中的2行

root@debian9:~# sed -n '2p' a.text
ce xx xx tom xx rhce xx tom xx

注意,我们也里面要用到-n 选项,如果不用-n 静默模式的话,
它会显示全部内容(这是sed的默认动作,可以看一下工作模式),匹配到的内容会显示两遍

2,删除a.text 中2-4行

root@debian9:~# sed "2,4d" a.text
zz xx tom xx tom rhce xx rh
yyyy rhce yyyyy 

3,上面删除a.text中2-4行,也可以这样表示

root@debian9:~# sed "2,+2d" a.text
zz xx tom xx tom rhce xx rh
yyyy rhce yyyyy 

4,删除以x开头的行。

root@debian9:~# sed "/^x/d" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
yyyy rhce yyyyy 

5,删除a.text中以第一个zz开头的行到第一个xx开头的行结束。

root@debian9:~# sed "/^zz/,/^xx/d" a.text
xxx xxx tom rhce xx xx
yyyy rhce yyyyy

command 命令的用法

1,i \string 的用法,在a.text中ce开头的行前面追加 i love linux 的新行

root@debian9:~# sed "/^ce/i \i love linux" a.text
zz xx tom xx tom rhce xx rh
i love linux
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy 

2,a \string 的用法和i \string 类似 在a.text中ce开头的行后面追加i love linux 的新行

root@debian9:~# sed "/^ce/a \i love linux" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
i love linux
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy

3,r file的用法,把/etc/fstab 追加到a.text中含有y的行。

root@debian9:~# sed "/.*y.*/r /etc/fstab" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
/etc/fstab: static file system information.
<file system> <mount point>   <type>  <options>   <dump>  <pass>
/ was on /dev/sda1 during installation
UUID=d12e3f89-049d-45c1-8b31-3a1cf551585f /   ext4    errors 0       1
swap was on /dev/sda5 during installation
UUID=07308ec5-870b-46f0-b983-ebc2a56fb0f2 none  swap    sw   0       0
/dev/sr0  /media/cdrom0   udf,iso9660 user,noauto     0       0

4,w file 的用法,把a.text中含有tom的行,保存到/root/b.text

root@debian9:~# sed "/tom/w /root/b.text" a.text
root@debian9:~# cat b.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx 

5,s/patten/string/的使用。把a.text 中第一个tom换成jerry .

root@debian9:~# sed "s/tom/jerry/" a.text
zz xx jerry xx tom rhce xx rh
ce xx xx jerry xx rhce xx tom xx
xx xx jerry xx rhce xx xx
xxx xxx jerry rhce xx xx
yyyy rhce yyyyy 

提示;sed默认只替换第一个匹配到的patten.如果想替换只替换第二tom为jerry
这时替换标记就用作用了
这条命令可以这样写:sed "s/tom/jerry/2" a.text 以此类推。可以替换想要替换的,

如果要想替换全部的可以写成
sed "s/tom/jerry/g" a.text

root@debian9:~# sed "s/tom/jerry/g" a.text
zz xx jerry xx jerry rhce xx rh
ce xx xx jerry xx rhce xx jerry xx
xx xx jerry xx rhce xx xx
xxx xxx jerry rhce xx xx
yyyy rhce yyyyy

&和\1的用法,&和\1的相同之处,和不同点
把she like my love 中 like和love后面都加上一个r.变成she liker my lover

root@debian9:~# echo "she like my love" | sed "s/l..e/&r/g"
she liker my lover

注释,&表示前一个/patten/中的内容

root@debian9:~# echo "she like my love" | sed  "s/\(l..e\)/\1r/g"
she liker my lover

可以用分组的方法来实现后向引用。

如果把she like my love 中like和love中的l变成L。变成she Like my Love

root@debian9:~# echo "she like my love" | sed  "s/l\(..e\)/L\1/g"
she Like my Love

这样的只能用分组来实现。不能用&来引用。

sed的高级用法

command:命令、

=:显示行号
n:读取匹配模式的行的下一行到模式空间中.注:模式空间中匹配模式的行被删除。
N:读取匹配模式的行,和匹配模式行的下一行。
h 拷贝模板块的内容到内存中的缓冲区。如果原来缓冲区有内容被覆盖
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面

高级command的用法

1,= 的用法。显示以ce开头的是第几行。

root@debian:~#  sed "/^ce/=" a.text
zz xx tom xx tom rhce xx rh
2
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy 

2,n 的用法。把zz开头的行,下一行中的tom全部换成TOM

root@debian:~# sed "/^zz/{n;s/tom/TOM/g}" a.text
zz xx tom xx tom rhce xx rh
ce xx xx TOM xx rhce xx TOM xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy 

3,N的用法,把zz开头的行和下一行中的rhce全部换成RHCA.

root@debian:~# sed "/^zz/{N;s/rhce/RHCA/g;s/rh\nce/RH\nCA/}" a.text
zz xx tom xx tom RHCA xx RH
CA xx xx tom xx RHCA xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy 

首先,要用N读取zz开头的行和它的下一行,可以看到zz行的结尾处rh和ce开头的行是两行,
用s/rhce/RHCA/g不会被替换。所以我们还要s/rh\nce/RH\nCA/来替换。

如果我们使用多行模式,^就不是表示行的开头,而是模式空间里的开头,$也不是行的结尾了,而是行的结尾

root@debian:~# sed "/^xx/{N;s/^xx/qq/g}" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
qq xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy

分析:如果不是模式空间的开头,那么下面两个xx也会被替换成qq.

h和G的用法:
我们新建一个文本b

#cat b
a
b
aa
bb

4,通过模式空间和保持空间的转化实现的效果

root@debian:~# sed "/a/{h;d};/b/G" b
b
a
bb
aa

sed [options] -f scriptfile file (2)
通常通过脚本对文件批量处理;
如一个文件中需要多出用sed 修改可以使用脚本
脚本文件格式为:'addresscommand'
'addresscommand'
......

sed的基本用法和高级用法相关推荐

  1. GUN sed高级用法,sed脚本编写

    这里举一些sed常用的高级用法例子经供参考: 一下操作都针对file.txt文件作修改 [root@QX-××× ~]# cat file.txt libgcc-4.4.7-4.el6.x86_64 ...

  2. Linux sed命令高级用法精讲

    <Linux sed用法详解>一节给大家介绍了如何用 sed 命令的基本功能处理文本中的数据,所涵盖的知识点,可以满足日常大多数文本编辑需求.本节将介绍 sed 提供的一些高级功能,这些功 ...

  3. Linux文本处理sed命令高级用法

    sed 工作原理 sed 即 Stream EDitor,和 vi 不同,sed是基于行的文本编辑器 Sed是从文件或管道中读取一行,处理一行,输出一行:再读取一行,再处理一行,再输出一行,直到最后一 ...

  4. html表格标签高级应用,asp.net core标签助手的高级用法TagHelper+Form

    上一篇博客我讲解了TagHelper的基本用法和自定义标签的生成,那么我就趁热打铁,和大家分享一下TagHelper的高级用法~~,大家也可以在我的博客下随意留言. 对于初步接触asp.net cor ...

  5. 详解Vue中watch的高级用法

    转载自  详解Vue中watch的高级用法 我们通过实例代码给大家分享了Vue中watch的高级用法,对此知识点有需要的朋友可以跟着学习下. 假设有如下代码: 1 2 3 4 5 6 7 8 9 10 ...

  6. (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...

  7. 8 个 Linux 下 ls 命令的高级用法!个个惊艳!

    作者 | 良许 责编 | 胡巍巍 在Linux下,ls这个命令大家肯定太熟悉了,笔者相信只要是Linux工程师,每天都会离不开这个命令,而且一天会使用个几百次. 但是,除了ls -l以外,你还知ls的 ...

  8. linux 编辑模式使用sed,sed命令的用法和vim编辑器的使用

    一.文本处理工具sed sed [option]-.'script] [input-file]- 简介: sed是一种流编辑器,他一次处理一行的内容,处理时把当前处理的行存储在临时缓冲区中,这个缓冲区 ...

  9. Qt QVector 详解:从底层原理到高级用法

    目录标题 引言:QVector的重要性与简介 QVector的常用接口 QVector和std::Vector 迭代器:遍历QVector 中的元素(Iterators: Traversing Ele ...

最新文章

  1. 云存储领域的那些安全难题与解决途径
  2. Python 使用正则表达式中的 /b 的时候出现了问题
  3. LiveVideoStackCon讲师热身分享 ( 七 ) —— 视频编码器的对比与选择
  4. oracle 10g rman catalog数据库版本问题
  5. virtualbox macos_MacOS 终于可以完美使用 Podman 了!
  6. python地图热力图是什么意思_python热力图
  7. Hadoop之基础概念
  8. 模糊逻辑基本原理与编程
  9. C++中begin、end、front、back函数的用法
  10. Unity环境光 Environment面板
  11. java验证图片大小_java 校验图片的大小、尺寸、比例
  12. 相似度衡量: 苏剑林博客-1
  13. 2021年软考科目怎么选?
  14. 使用python编写LDPC编码
  15. 越野赛车 v1.0 怎么用
  16. 计算机一直显示配置更新失败怎么办,win10电脑windows更新失败怎么办?更新失败却一直在更新...
  17. java基于安卓Android/微信小程序的高校校园跑腿系统 uniapp
  18. 【论文阅读笔记】Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer
  19. 【2022】年度总结
  20. Android中多行文本末尾添加图片 图标在文字后面 换行

热门文章

  1. Spring Security的内置过滤器是如何维护的?
  2. 前两天谁要的抢红包利器,给你安排了
  3. 皮一皮:这小伙子怎么能掌握这么多高深技术!!!
  4. 就是你把所有代码全写在一个类里的?
  5. Spring Cloud Contract 契约测试实践
  6. python opencv 画矩形框 外接矩形
  7. pybind opencv mat
  8. ubuntu安装protobuf
  9. vlfeat 特征检测
  10. elasticsearch match模糊查询