sed

简介

sed是一种流编辑器,以行为单位进行文本处理,可以将数据行进行替换、删除、新增、选取等操作。

sed [options] 'command' file(s)

基本命令

匹配内容

$ sed 'p' /etc/passwd # 每一行输出两次

$ sed -n 'p' /etc/passwd # 每行只出现一次

$ sed -n '/root/p' /etc/passwd

root:x:0:0:root:/root:/bin/zsh

# 等同于

$ grep 'root' /etc/passwd

root:x:0:0:root:/root:/bin/zsh

行定位

定位一行

$ sed -n '10p' /etc/passwd # 打印第10行

news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

$ nl /etc/passwd | sed -n '10p'

10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

定位多行

$ nl /etc/passwd | sed -n '10,12p' # 指定行数

10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

11 uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

12 proxy:x:13:13:proxy:/bin:/usr/sbin/nologin

$ nl /etc/passwd | sed -n '/uuidd/,/sshd/p' # 指定内容 匹配从uuidd到sshd的行

27 uuidd:x:108:112::/run/uuidd:/bin/false

28 dnsmasq:x:109:65534:dnsmasq,,,:/var/lib/misc:/bin/false

29 sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin

反向匹配

$ nl /etc/passwd | sed -n '10!p' # 匹配第10行之外的内容

$ nl /etc/passwd | sed -n '10,20!p' # 匹配除第10至20行之外的内容

间隔行

$ nl passwd | sed -n '1~2p' # 从第1行开始,每隔2行打印

1 root:x:0:0:root:/root:/bin/zsh

3 bin:x:2:2:bin:/bin:/usr/sbin/nologin

5 sync:x:4:65534:sync:/bin:/bin/sync

7 man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

...

新增行

$ nl /etc/passwd | sed '2a=======' # 在第2行下新增一行,内容为=======

1 root:x:0:0:root:/root:/bin/zsh

2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

=======

3 bin:x:2:2:bin:/bin:/usr/sbin/nologin

...

$ nl /etc/passwd | sed '1,3a=======' # 在第1至3行,每行后面都新增内容

1 root:x:0:0:root:/root:/bin/zsh

=======

2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

=======

3 bin:x:2:2:bin:/bin:/usr/sbin/nologin

=======

4 sys:x:3:3:sys:/dev:/usr/sbin/nologin

...

插入行

$ nl /etc/passwd | sed '1,3i======='

=======

1 root:x:0:0:root:/root:/bin/zsh

=======

2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

=======

3 bin:x:2:2:bin:/bin:/usr/sbin/nologin

替代行

$ nl /etc/passwd | sed '1,3c======='

=======

4 sys:x:3:3:sys:/dev:/usr/sbin/nologin

替换是整体替换,而不是每一行替换

删除行

$ nl /etc/passwd | sed '1,3d'

4 sys:x:3:3:sys:/dev:/usr/sbin/nologin

5 sync:x:4:65534:sync:/bin:/bin/sync

删除空行

$ sed '/^$/d' /etc/passwd

在文件末尾追加内容

$ sed '$a test1\ntest2' /etc/passwd

...

mysql:x:112:116:MySQL Server,,,:/nonexistent:/bin/false

test1

test2

替换

$ sed 's/false/true/' /etc/passwd # 仅替换每一行的第一个

$ sed 's/false/true/g' /etc/passwd # 全局替换每行出现的文本

筛选数据

$ ifconfig | sed -n '/inet /p' | sed 's/inet.*r://' | sed 's/B.*//' |

sed 's/M.*//'

127.0.0.1

192.168.1.6

获取不连续的行

$ nl passwd | sed -n -e '2,3p' -e '10,12p'

2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

3 bin:x:2:2:bin:/bin:/usr/sbin/nologin

10 news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

11 uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

12 proxy:x:13:13:proxy:/bin:/usr/sbin/nologin

忽略大小写

sed 's/linux/unix/gi' /etc/passwd

写入空行

sed G /etc/passwd # 在每行之后新增一行

sed 'G;G' /etc/passwd # 在每行之后新增两行

修改原文件

直接修改原文件

sed -i 's/linux/unix/' /etc/passwd

拷贝原文件副本再进行修改

$ sed -i'.orig' 's/linux/unix/gi' /etc/passwd

$ ls /etc/passwd.*

passwd passwd.orig

小括号反向引用

$ sed 's/\(unix\)/learn \1/g' /etc/passwd

仅当符合某条件时才进行内容替换

sed '/learn/s/unix/linux/g' /etc/passwd

当行中同时存在learn及unix时,才将unix替换为linux

批量替换

sed 's/mysql/mysql_user/gi;s/linux/unix/gi' /etc/passwd

高级命令

执行多个sed命令

-{}: 用;分开多个sed命令

nl /etc/passwd | sed '{20,30d;s/false/true/}' # 删除第20至30行,将false替换成true

读取一个输入 行

$ nl passwd | sed -n '{n;p}' # 间隔了一行取出 偶数行

$ nl passwd | sed -n '{p;n}' # 奇数行输出

# 另一种实现方式

$ nl passwd | sed '1~2p'

$ nl passwd | sed '2~2p'

$ nl passwd | sed -n '{n;n;p}'

3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

6 sync:x:5:0:sync:/sbin:/bin/sync

9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

$ nl passwd | sed -n '{n;p;n}'

2 bin:x:1:1:bin:/bin:/sbin/nologin

5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

8 halt:x:7:0:halt:/sbin:/sbin/halt

替换固定字符串

$ sed 's/^[a-z_-]\+/& /' /etc/passwd # 用户名后加上空格

$ sed 's/^[a-z_-]\+/\U&/' /etc/passwd # 将用户名替换成大写

数据筛选

$ sed 's/\(^[a-z0-9_-]\+\):x:\([0-9]\+\):\([0-9]\+\):.*$/user:\1 uid:\

2 gid:\3/' /etc/passwd

user:root uid:0 gid:0

user:daemon uid:1 gid:1

user:bin uid:2 gid:2

...

复制指定文件插入到匹配行

$ echo -e '2412424124\n3432534\n5353523523' > 123.txt

$ echo -e 'dfgetetetete\njpkpwefwe\nlidwoew' > abc.txt

$ sed '1r 123.txt' abc.txt # 将123.txt插入到abc.txt的第1行后面

dfgetetetete

2412424124

3432534

5353523523

jpkpwefwe

lidwoew

读文件并不改变两个文件的内容,只是输出,需要用重定向将结果保存

提前退出

$ nl /etc/passwd | sed '3q' # 只取出前3行

1 root:x:0:0:root:/root:/bin/zsh

2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

3 bin:x:2:2:bin:/bin:/usr/sbin/nologin

$ nl /etc/passwd | sed '/nologin/q' # 找到第一个nologin就退出

1 root:x:0:0:root:/root:/bin/zsh

2 daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

linux sed后 保存文本,实例详解linux文本三剑客--sed相关推荐

  1. 458-Linux 三剑客实例详解(grep、sed 、awk)

    1.简介 Linux 操作文本的三大利器分别是 grep.sed .awk,简称三剑客. 大师兄 awk:最擅长取列: 二师兄 sed:最擅长取行: 三师兄 grep:最擅长过滤. 2.正则表达式 3 ...

  2. linux shell 端口占用,linux 查看端口占用命令实例详解

    linux 查看端口占用命令实例详解 端口是系统非常重要的一个东东,我们经常需要查看哪个进程占用了哪个端口,或者哪个端口被哪个进程占用.废话不多说,直接上干货,教大家怎样查看系统端口占用情况. 方法一 ...

  3. linux 内存 参数,linux free命令参数及用法详解(linux查看内存命令)

    linux free命令参数及用法详解(linux查看内存命令) 2019年05月31日 | 萬仟网科技 | 我要评论 free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段 ...

  4. linux中的su-命令的功能,linux su命令参数及用法详解(linux切换用户命令)

    linux su命令参数及用法详解(linux切换用户命令) 发布时间:2012-07-21 12:12:39   作者:佚名   我要评论 su的作用是变更为其它使用者的身份,超级用户除外,需要键入 ...

  5. linux命令优先级设置,linux renice命令参数及用法详解(linux修改程序运行优先级命令)...

    linux renice命令参数及用法详解(linux修改程序运行优先级命令) 发布时间:2012-07-21 12:45:32   作者:佚名   我要评论 renice指令可重新调整程序执行的优先 ...

  6. linux 的中断 命令,linux skill命令参数及用法详解(linux中断进程执行命令)

    linux skill命令参数及用法详解(linux中断进程执行命令) 发布时间:2012-07-21 12:09:37   作者:佚名   我要评论 linux 冻结进程命令 skill 使用详解 ...

  7. linux中whoami命令的作用是,linux whoami命令参数及用法详解(linux查看登陆用户名)

    linux whoami命令参数及用法详解(linux查看登陆用户名) 2019年05月31日 | 萬仟网科技 | 我要评论 whoami 命令显示登录名.与使用命令 who 并指定 am i 不同, ...

  8. linux中fdisk的参数,Linux fdisk命令参数及用法详解--Linux磁盘分区管理命令fdisk

    fdisk 命令 linux磁盘分区管理 用途:观察硬盘之实体使用情形与分割硬盘用. 使用方法: 一.在 console 上输入 fdisk -l /dev/sda ,观察硬盘之实体使用情形. 二.在 ...

  9. linux上 arm开发环境搭建,详解 LINUX下QT For ARM开发环境搭建过程

    LINUX下QT For ARM开发环境搭建过程是本文介绍的内容,不多说,先来看内容.在PC上,我们需要得到两个版本的Qt,分别是:Qt-4.5.2和QtEmbedded-4.5.2-arm.前者包括 ...

最新文章

  1. SAP ABAP 如何查询一个变量表里的变量被哪支程序使用到?
  2. 耐能团队论文登上《自然·电子学》:集成忆阻器与CMOS以实现更好的AI
  3. 中小企业ERP快速实施的八大准则
  4. C++的cin和cout取消同步
  5. 【转】Linux写时拷贝技术(copy-on-write)
  6. MFC线程创建运行关闭的问题
  7. JavaFX UI控件教程(六)之Toggle Button
  8. 基于visual c++之windows核心编程代码分析(30)Telnet协议编程
  9. C# 从DataTable中取值
  10. 电脑安装系统后出现no bootable device_炉石传说:用电脑领取安卓和iOS专属卡包你能信?亲测有效!...
  11. Kotlin入门(29)任务Runnable
  12. [DiMP跟踪算法]代码学习笔记
  13. 统信系统安装京瓷打印机驱动步骤 针对京瓷系列复合机的UOS操作系统用户使用说明
  14. 解决Windows11能登录QQ微信,但不可以使用浏览器上网
  15. C如何简单的读写文件?二进制文件如何读写?如何移动文件指针?
  16. 笔记本电脑热点显示正在断开连接,一直无法开启热点,inetsh winsock reset 命令重置可以解决
  17. 去银行当程序员是一种什么体验
  18. 【ReID】Pyramidal Person Re-IDentification via Multi-Loss Dynamic Training
  19. 软件如何进行压力测试,软件如何进行压力测试?
  20. 关于tp-link 路由器

热门文章

  1. 【Java基础】final关键字总结
  2. jQuery 的上传图片预览插件
  3. python怎么让输出居中_python格式化输出字符串居中
  4. ubuntu命令安装中文语言包_win10之linux子系统ubuntu安装中文包(三)
  5. java 解决内存泄露_Java内存泄露的理解与解决
  6. 文件设置索引_Linux文件系统是怎么工作的?
  7. 佳能fax_l150如何打印_佳能faxl150说明书下载
  8. 音乐播放器界面如何设计?
  9. 淘宝京东设计师来看,电商Banner设计策略!
  10. ui kit模板的用途是什么?