https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK
简介: sed读一行放到模式空间进行处理 sed是一种在线的、非交互式的编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有更改,除非使用重定向存储输出。 sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序

文本处理:sed

1.sed工作流程

sed读一行放到模式空间进行处理

sed是一种在线的、非交互式的编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾,文件内容并没有更改,除非使用重定向存储输出。

sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序

sed -ri.bak

sed -ric --follow-symlinks

2.命令格式

sed [options] ‘command’ file(s) //选项后面跟命令

sed [options] -f scriptfile file(s) //选项后面跟sed命令的脚本

注意:

sed中空格也算一个字符

sed和grep不一样,不管是否找到指定的模式,它的退出转态都是0,只有当命令存在语法错误时,sed的退出状态码才是非0

sed命令在使用命令时,不加数字的话默认对每一行都进行模式匹配

例如 sed -r ‘4p’ //p命令表示打印,4p就是对第四行进行打印,其他行不会执行这个命令,如果是sed -r 'p’则是对每一行都执行此命令

3.支持正则表达式

与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的面膜是,用于查找和替换,以下是sed支持的元字符。

使用基本元字符集^,$,.,*,[],[^],\<\>,\(\),\{\}
使用扩展元字符集?,+,{},|,()=

使用扩展元字符的方式:

\+
sed -r

4.sed基本用法

sed -r 'p' passwd.txt       //打印所有行,会出现之前行的两倍,因为是原理就是先将一行放到屏幕然后在执行p命令,p命令是打印所以又会显示一行
sed -rn 'p' passwd.txt //使用-n选项,可以忽略执行命令之前的行
sed -rn '/root/p' passwd.txt //命令中的/root/p是指找到root的行进行打印
sed -r 's/root/jxl/' passwd.txt //找到root的行替换成jxl,仅限第一个找到的
sed -r 's/root/jxl/g' passwd.txt //全局替换
sed -r '1s/root/jxl/g' passwd.txt //在第一行查找并替换
sed -r '1s/Root/jxl/gi' passwd.txt //i表示忽略大小写
sed -r '/root/d/' passwd.txt //找到root的行然后删除
sed -r '\#root#d' passwd.txt //斜线可以换成任意符号一般想换建议使用#号 如果文件中需要修改的内容带有"/"斜线,可以使用下面的方法进行修改
sed -r 's/\/etc\/abc/\/var\/lib/' passwd.txt //将/etc/abc改成/var/lib,主要除了s///其他的斜线要用反斜线转义
sed -r 's#/etc/abc#var/lib#' passwd.txt //可以将斜线换成#,也可以是@,在这里的其他符号可以不用转义因为后面有了/

5.sed扩展

地址(定址)

地址用于决定对那些行进行编辑,地址形式可以是数组、正则表达式或二者的组合,如果没有设定地址,sed将处理输入文件中的所有行

sed -r 'd' passwd.txt   //删除所有行
sed -r '3d' passwd.txt //删除第三行
sed -r '1,3d' passwd.txt //删除一到三行
sed -r '/^root/d' passwd.txt //删除以root开头的行
sed -r '/bash$/d' passwd.txt //删除以bash结尾的行
sed -r '/\<root\>/d' passwd.txt //删除是root这个单词的行
sed -r '/root/,5d' passwd.txt //从root行开始删除到第5行
sed -r '/root/,+5d' passwd.txt //删除root行后在删除5行
sed -r 'root/!d' passwd.txt //!取反,只保留root行 sed -r '1~2d' passwd.txt //删除奇数行
sed -r '0~2d' paswd.txt //删除偶数行
sed -r '1~3d' passwd.txt //删掉一行后留两行在删一行留两行

6.sed命令

sed命令告诉sed对指定行进行何种操作,包括打印、删除、修改等

a 在当前行后添加一行或多行

c 用新文本修改替换当前行中的文本

d 删除行

i 在当前行之前插入文本

l 列出非打印字符 多打印一行,并在后面加上$

p 打印行

n 获取下一行的内容,常用于要处理的行没有明显特征,可以借助上一行在使用n对下一行进行处理

q 结束或退出sed

! 对所选航意外的所有行应用命令

S 用一个字符串替换另一个

s 替换标志

g 全局替换

i 忽略大小写

r 从文件中读

w 将行写入文件

y 将字符转换为另一字符

h 把模式空间里的内容复制到暂存缓冲区(覆盖)

H 把模式空间里的内容追加到暂存缓冲区

G 取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面

g 取出暂存空间的内容,将其复制到模式空间中,原来的内容会被覆盖

x 交换暂存缓冲区与模式空间的内容

选项

-e 允许多项编辑,使用多个命令

-f 指定sed脚本文件名

-n 取消默认的输出

-i inplace,就地编辑也就是在文件中直接修改

-r 支持扩展元字符

7.命令示例

删除命令:d

如果想要多个命令同时使用就在{}中以分号分隔

sed -r '3d' passwd.txt    //删除第三行
sed -r '3{d;}' passwd.txt //花括号中的d;其实表示可以使用多个命令选项,例如sed -r '3{p;d;}' passwd.txt
sed -r '3p;3d' passwd.txt //多个命令使用,等同于3{p;d}
sed -r '3{d}' passwd.txt //效果与3d一样
sed -r '3,$d' passwd.txt //从第三行开始一直删除到最后一行
sed -r '$d' passwd.txt //删除最后一行
sed -r '/norrth/d' datafile //删除匹配north的行

替换命令:s

sed -r 's/west/north/g' datafile      //将west替换成north
sed -r 's/^west/north/' datafile //将west开头的行换成north
sed -r 's/[0-9][0-9]$/&.5/' datafile //&表示在查找串中匹配的内容,也就是将查找出来的内容再次调用,以二个数字为结尾的换成原行在跟一个.5
sed -r 's/(.*)/#\1\' //在每一行前面加上#号
sed -r '1,5s/.*/#&/' //将一到五行开头加上#号
sed -r '1,5s/^/#' //也是1-5行前面加#号
sed -r 's/Hemenway/Jones/g' datafile //将Hemenway换成jones
sed -r 's/(Mar)got/\1ianne/g' datafile //将Mar做成组字符,在ianne前面调用也就是将margot换成morianne
sed -r 's#3#88#g' //将3换成88
sed -r 's/[0-9]+$/&.5/' passwd.txt //将结尾是数字的一个或多个的行在后面加上.5
sed -r 's/(.)(.)(.*)/\1\2jiang\3/' passwd.txt //第一个.表示第一个字符第二个.表示第二个字符第三个.*表示整行,也就是在第二个字符后面加其他内容可以在调用完1,2后跟上所需内容在调用3
sed -r 's/(.*)(.)(.)/\1jiang\2\3/' passwd.txt //在最后二个字符前加其他内容 ======================================================================================
sed -r 's/root/jiangxiaolong/g' passwd.txt //将root换成jiangxiaolong
sed -r 's/^root/jiangxiaolong/g' passwd.txt //将root开头的行换成jiangxiaolong
sed -r 's/[0-9][0-9]$/&.5/' passwd.txt //两个数字结尾的行换成原行内容在跟一个.5 &代表匹配的内容再次调用出来
sed -r 's/(.*)/#\1/' passwd.txt //将所有行前面加#
sed -r 's/.*/#&/' passwd.txt //将所有行前面加#,使用&方式调用获得结果
sed -r 's/^/#/' passwd.txt //将所有行前面加#
sed -r 's/^(ro)ot/\1jiang/' passwd.txt //将ro做成组字符,然后后面调用,也就是将root改成rojiangxiaolong
sed -r 's/(.)(.)(.*)/\1\2jiang\3/' passwd.txt //在每一行的第二个字符前面加上任意内容,空格也代表一个字符
sed -r 's/(.*)(.)(.)/\1jiang\2\3/' passwd.txt //在每一行结尾的最后两个字符前加其他内容

读文件命令:r

sed -r '/lp/r /etc/hosts' passwd.txt  //在lp行后面插入/etc/hosts/文件的内容
sed -r '2r /etc/hosts' passwd.txt //在第二行后面读入/etc/hosts/中的内容
sed -r '/2/r /etc/hosts' passwd.txt //这个跟2r有区别,这里是2在//中表示正则匹配,只有出现2的地方就会读入/etc/host

写文件命令:w

另存为的文件必须要有写入权限

每次另存到同一个文件,之前文件的内容会被覆盖掉

sed -r '/root/w /tmp/a.txt' passwd.txt  //查找包含root的行,并保存到/tmp/a.txt文件中
sed -r '3,$w /tmp/a.txt' passwd.txt //从第三行一直到最后一行保存到/tmp/a.txt文件中

追加命令:a

sed -r '2a chkconfig 35 21 85' passwd.txt  //在第二行后面追加内容
sed -r '/root/a jiangxiaolong' passwd.txt //在包含root的行后面加内容
sed -r '2a jiang\
>xiao\
>long' passwd.txt //第二行后面追加多行

插入命令:i

sed -r '2i jiang' passwd.txt      //在第二行插入内容
sed -r '/root/i jiang' passwd.txt //在包含root的行插入内容,会在root行前面插入
sed -r '2i jiang\
>xiao\
>long' passwd.txt //在二行插入这些内容,这些内容会从第二行开始插入

修改命令:c

sed -r '/root/c jiang' passwd.txt     //将root行换成jiang
sed -r '1c jiang' passwd.txt //将第一行的内容换成jiang
sed -r '1c 1111\
> 222\
> 333' passwd.txt //将第一行的内容换成1111并添加222 333

获取下一行:n

获取下一行的内容,常用于要处理的行没有明显特征,可以借助上一行在使用n对下一行进行处理,类似于隔山打牛,实际上匹配的这一行但是不对这一行做操作而是对下一行

sed -r '/lp/{n;d}'      //查找lp的行并对下一行执行d命令
sed -r 'lp{n;s/sbin/bin/}' //查找lp的行并对下一行执行s命令
sed -r '/lp/{n;n;s/sbin/bin/}' passwd.txt //查找lp的行在它的下两行执行s命令,n可以使用多个,一个表示下一行,二个表示下二行

暂存和取用命令:h H g G

sed命令除了模式空间还有暂存空间,所谓暂存空间就是把一行处理后放到一个暂存空间,在需要的时候进行调用,在暂存空间里小写的命令比如说h、g都是具有覆盖的功能,而大写的命令例如H、G都表示追加,暂存空间默认只有换行符

一般第一次放入暂存空间会使用覆盖的方式,因为默认会有一个空行

sed -r '1h;$G' passwd.txt     //把第一行覆盖到暂存空间,在最后一行的时候将模式空间的内容追加到最后一行下面
sed -r '1{h;d};$G' passwd.txt //把第一行覆盖到暂存空间并删除,在最后一行在调用追加,相当于把第一行剪切到最后一行
sed -r '1h;2,$g' passwd.txt //把第一行覆盖到暂存空间,从第二行到最后一行,每读一行就从暂存空间调回来,这里用的g表示覆盖,因此每调用一次都会把原来的内容覆盖掉,这样整个文本都会和第一行一样
sed -r '1h;2,3H;$G' passwd.txt //把第一行覆盖到暂存空间,第二行第三行追加到暂存空间,在最后一行的时候在调用暂存空间的内容,这里的动作是追加

暂存空间与模式空间互换:x

互换是指,将暂存空间的内容换到模式空间,再将模式空间的内容放到了暂存空间

sed -r '3h;5x;$G' passwd.txt    //将第3行覆盖到暂存空间,读到第5行时将暂存空间与模式空间的内容互换,也就是处理完后第五行的

取反命令:!

!一般放在命令前面

sed -r '1!a jiang' passwd.txt   //除了第一行都追加

-e多重编辑

-e选项完全用不着可以说,可以使用;将每个命令隔开即可

如果要对同一行进行操作还可以用{}方式

sed -r -e '1,3d' -e 's/bin/aaa/g' passwd.txt
sed -r '1,3d;s/sbin/bin/g' passwd.txt
sed -r '2s/bin/jiang/g;2s/x/aaa/g' passwd.txt
sed -r '2{s/bin/jiang/g;s/x/aaa/g}' passwd.txt

8.sed常见操作

删除配置文件中#号注释行

sed -r '/^#/d' /etc/vsftpd/vsftpd.conf      //只删除文件中以#开头的行
sed -r '/^[ \t]*#/d' /etc/vsftpd/vsftpd.conf //删除以空格或者制表符出现0次或多次在跟一个#的行
sed -r '/^[ \t]*#d;/^[ \t]*$/d' /etc/vsftpd/vsftpd.conf //删除以空格或者制表符出现0次或多次在跟一个#的行并且删除只以空格或者制表符出现0次到多次结尾的行,也就是既删除注释行也删除空行 sed -r '/^[ \t]*#/!d' /etc/vsftpd/vsftpd.conf //取反只留下了注释行

删除配置文件中的//号注释行

sed -r '\#^[ \t]*//#d' szlxwj.txt
• 1

删除无内容的空行

sed -r '/^$/d'  /etc/vsftpd/vsftpd.conf
sed -r '/^[ \t]*$/d' /etc/vsftpd/vsftpd.conf

删除注释行及空行

sed -r '/^[ \t]*#/d;/^[ \t]*$/d' /etc/vsftpd/vsftpd.conf    

sed -r '/^[ \t]*#|^[ \t]*$/d'  /etc/vsftpd/vsftpd.conf    //将两部分合为一部分,用|元字符代表或者的意思

sed -r '/^[ \t]*(#|$)/d'  /etc/vsftpd/vsftpd.conf   //利用元字符,因为前部分都一样只需要把不一样的地方用或者表示即可

修改文件

sed -ri '$a chroot_local_user=YES' /etc/vsftpd/vsftpd.conf    //在最后一行追加内容
sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/sysconfig/selinux //将开头为SELINUX的行整个换成SELINUX=disbaled
sed -ri '/UseDNS/cUseDNS no' /etc/ssh/sshd_config

给文件行增加注释

sed -r '1,5s/(.*)/#\1/' passwd.txt
sed -r '1,5s/.*/#&/' passwd.txt
sed -r '1,5s/^/#$/' passwd.txt
sed -r '1,5s/^#*/#/' passwd.txt //查找1到5行如果是以0到一个#号卡头的行换成一个#号
sed -ri '1,2s/(.*)/\t#\1/;3s/(.*)/#\1/' passwd.txt //1,2行增加一个制表符在加一个#号,3行只加一个#号
sed -r '1,3s/^[ \t]*#*/#/' passwd.txt //将1到3行中以空格或者制表符0个或多个开头的在跟一个#0个或多个替换成#
sed -r '1,3s/^[ \t#]*/#/' passwd.txt //将以空格制表符#出现0到多次替换成#
删掉一个注释行
sed -ri '1,3s/(.)(.*)/\2/' passwd.txt

sed中引入变量

var=1111jiang     //先定义变量

sed -r '3a$var' passwd.txt    //这种方式是错误的,因为单引号是强引用,直接就会追加$var而不是对应的值
sed -r "3a$var" passwd.txt //使用双引号即可
sed -r 3a$var passwd.txt //不适用任何引号也可以 sed -r "$a$var" passwd.txt //这里双引号会把$a误以为是变量,也是错误的
sed -r '$a'"$var" passwd.txt //可以各自使用各自的引号
sed -r "\$a$var" passwd.txt //也可以使用\进行转义

文件内容倒转

sed -r '1!G;$!h;$!d' 12345.txt

l

var=1111jiang //先定义变量

sed -r '3av a r ′ p a s s w d . t x t / / 这 种 方 式 是 错 误 的 , 因 为 单 引 号 是 强 引 用 , 直 接 就 会 追 加 var' passwd.txt //这种方式是错误的,因为单引号是强引用,直接就会追加var

passwd.txt//这种方式是错误的,因为单引号是强引用,直接就会追加var而不是对应的值

sed -r "3av a r " p a s s w d . t x t / / 使 用 双 引 号 即 可 s e d − r 3 a var" passwd.txt //使用双引号即可 sed -r 3avar"passwd.txt//使用双引号即可sed−r3avar passwd.txt //不适用任何引号也可以

sed -r “a aavar” passwd.txt //这里双引号会把a 误 以 为 是 变 量 , 也 是 错 误 的 s e d − r ′ a误以为是变量,也是错误的 sed -r 'a误以为是变量,也是错误的sed−r

a’"$var" passwd.txt //可以各自使用各自的引号

sed -r “$a$var” passwd.txt //也可以使用\进行转义

文件内容倒转

```shell
sed -r '1!G;$!h;$!d' 12345.txt

[转帖]Linux文本处理三剑客sed详解(正则匹配、命令示例)的更多相关文章

  1. Linux文本编译工具VIM详解

    Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 >.vi: 全称Visual editor,即文本编辑 ...

  2. Linux文本处理三剑客之grep及正则表达式详解

    Linux文本处理三剑客之grep及正则表达式详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux文本处理三剑客概述 grep: 全称:"Global se ...

  3. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  4. 三剑客基础详解(grep、sed、awk)

    目录 三剑客基础详解 三剑客之grep详解 1.通配符 2.基础正则 3.grep 讲解 4.拓展正则 5.POSIX字符类 三剑客之sed讲解 1.sed的执行流程 2.语法格式 三剑客之Awk 1 ...

  5. 关于Linux文本处理“三剑客”的一些小操作。

    Linux文本处理“三剑客”,即grep.sed.awk,这是Linux中最核心 的3个命令. 一.首先做个简单的介绍: 1.awk:linux三剑客老大,过滤,输出内容,一门语言.NR代表行号. 2 ...

  6. Linux文本处理三剑客之——grep

    一Linux文本处理三剑客之——grep Linux文本处理三剑客都支持正则表达式 grep :文本过滤( 模式:pattern) 工具,包括grep, egrep, fgrep (不支持正则表达式) ...

  7. Linux 文本处理三剑客之grep

    文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...

  8. sed 详解

    sed 详解 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕 ...

  9. sed 详解【转】

    原文地址:http://www.cnblogs.com/sparkdev/archive/2017/07/10/7138073.html 基本命令格式 sed [常用选项] 命令文本 输入 常用选项 ...

  10. linux PHP 编译安装参数详解

    linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...

随机推荐

  1. 看火山引擎DataLeap如何做好电商治理(一):挑战与痛点

    现在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式.根据中国电子商会发布的<中国社交电商行业发展白皮书(2022)>的数据显示,2022年社交电商市场交易规模达到28542.8 ...

  2. Jenkins Pipeline 流水线 - withCredentials 使用

    添加凭证 Pipeline script pipeline { agent any stages { stage('withCredentials 使用凭证') { steps { withCrede ...

  3. Winform 嵌入html,数据交互

    Winform 嵌入html,数据交互,将JS中的数据等传给winform 点击浏览器中的按钮,触发 Winform 中的方法 https://github.com/cefsharp/CefSharp ...

  4. SpringBoot 拦截器 统一日志 记录用户请求返回日志

    你请求我接口,传了什么参数,我返回了什么值给你,全部记下来.防止扯皮 需求:记录每次用户请求Controller的Body参数, 思路:在每个Controller 该当中记录,容易漏记,如果在拦截器里 ...

  5. 在 Ubuntu 20.04 上安装 Visual Studio Code

    Visual Studio Code 是一个由微软开发的强大的开源代码编辑器.它包含内建的调试支持,嵌入的 Git 版本控制,语法高亮,代码自动完成,集成终端,代码重构以及代码片段功能. Visual ...

  6. 在wsl2 kali发行版中安装docker

    前言 因为不想开虚拟机,而又需要多个linux发行版来做测试,也不想使用docker-desktop来曲线救国,所以想直接安装个docker随时使用,这一路也是踩了不少坑.直接复制进终端进行安装 su ...

  7. 2023陕西省大学生信息安全竞赛web writeup

    前言 早写好了,忘发了,题目质量还行,够我坐大牢 ezpop 简单的反序列化,exp如下 <?php class night { public $night; } class day { pub ...

  8. 🚀Flutter应用程序的加固原理

    ​ 在移动应用开发中,Flutter已经成为一种非常流行的技术选项,可以同时在Android和iOS平台上构建高性能.高质量的移动应用程序.但是,由于其跨平台特性,Flutter应用程序也面临着一些安 ...

  9. 1688 复杂业务场景下的 Serverless 提效实践

    1688 复杂业务场景下的 Serverless 提效实践 作者 | 远岩(阿里巴巴 CBU 技术部 Serverless & 工程效能负责人) 前言 首先为大家简单介绍一下我们的业务场景,1 ...

  10. 一、swift对象存储环境搭建

    系列导航 一.swift对象存储环境搭建 二.swift添加存储策略 三.swift大对象--动态大对象 四.swift大对象--静态态大对象 五.java操作swift对象存储(官网样例) 六.ja ...