[转帖]Linux三剑客之sed的初阶使用

linux,三剑客,sed,初阶,使用 · 浏览次数 : 0

小编点评

**sed 非交互式文件内容修改工具** sed 是一个非交互式流式编辑器,可用于从管道中获取过滤输入流的文本或字段的值。它比交互式编辑器速度更快,并能够从多个文件中读取数据。 **主要功能:** * **修改文件内容:**使用 `s` 命令可以替换文本或替换字符串。 * **插入内容:**使用 `i` 命令可以插入文本或替换字符串。 * **删除内容:**使用 `d` 命令可以删除匹配的字符串。 * **插入多个行:**使用 `2i` 或 `2a` 命令可以插入文本或替换字符串在指定位置。 * **注释文件:**可以使用 `#` 符号在行首插入注释。 * **匹配文本:**使用 `/pattern/`正则表达式可以匹配文本。 **使用方法:** 1. **读取文件:**使用管道将文件读入 `sed` 的输入。 2. **执行修改操作:**使用 `s`、`i`、`d` 或其他命令进行文本或字符串替换。 3. **保存文件:**使用 `-i`选项保存修改后的文件。 **示例:** ```bash # 创建文件 content.txt cat << EOF > content.txt This is the first line. This is the second line. This is the third line. EOF # 修改文件内容 sed '1 s/This is the first line./This is the modified first line./' content.txt # 编写一个注释 echo "/* This is a comment */" >> content.txt # 将所有包含 "mail" 的行注释掉 sed '/mail/s/mail/MAIL/g' content.txt # 将所有空行删除 sed '/^$/d' content.txt # 插入一个新行 echo "This is a new line." >> content.txt # 替换匹配到的字符串 sed 's/root/#root/p' content.txt ``` **注意:** * `sed` 只能处理单行文本。 * `sed` 中的正则表达式必须在双引号中定义。 * `-i`选项会对原始文件进行修改,请确保你备份或复制文件。

正文

https://www.jianshu.com/p/ceea435635a2

 

大多数情况下,对于文件内容的修改需要依赖交互式的软件来实现,例如vim修改文件的内容则是依赖光标的移动和修改操作来完成对文件某一处内容的修改。然而,在linux操作系统中,也存在一种非交互式的方法来修改文件内容,通过发送特殊的指令给终端使其完成对特定内容文件的修改。

sed(Stream editor) 正是一种非交互的流式编辑器。sed 支持修改一个输入流(文件或管道)中的文本或字段的值,且因为只会对输入的流文件进行一次处理,因此 sed 的工作效率要比其他的编辑器更加高效。而能够从管道(Pipeline)中获取过滤输入流,这也是sed相比其他编辑器的显著区分。

语法

sed [OPTION]... {script-only-if-no-other-script} [input-file]...

参数含义

  • -n, --quiet, --silent: 抑制命令执行过程中的打印信息

  • -e script: 指定的脚本中的命令将被执行

  • -f script-file: 指定的脚本文件中是sed的编辑命令

  • --follow-symlinks: 对于链接文件,替换的时候源文件也会进行替换

  • -i[SUFFIX]: 编辑文件进行替换(如果提供了SUFFIX,则进行备份)。默认没有指定 -i 的情况下,sed只将指令的结果打印到终端,不会修改文件的内容。

  • -c, --copy: 使用-i选项的时候用复制代替重命名

  • --posix: 禁用GUN扩展

  • -r: 使用扩展正则表达式

替换标记

  • g: 替换每行中匹配到的所有字符

  • p: 打印被sed程序处理过的行

  • d: 指定行将被删除

  • s: 替换指定字符串

详细用法

  • 删除文件中指定的行
#wc -l /tmp/passwd
39 /tmp/passwd

#sed -i '11,39d' /tmp/passwd    # 删除11-39行的记录 && 指令-i后才会修改文件

#wc -l /tmp/passwd
10 /tmp/passwd
  • 删除文件的最后一行
#sed -i '$d' /tmp/passwd

#wc -l /tmp/passwd
9 /tmp/passwd
  • 删除文件中的匹配行
#sed -i '/nologin$/d' /tmp/passwd       # nologin$ 表明匹配以nologin结尾的行; 对应的 ^nologin 表明以nologin为首的行

#wc -l /tmp/passwd
4 /tmp/passwd
  • 删除输入流中的空行
#sed -i '/^$/'d /tmp/passwd
  • 替换一行中的第一个匹配到的字符串
#cat -n /tmp/passwd
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
     8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  operator:x:11:0:operator:/root:/sbin/nologin

#sed -n 's/mail/exchange/p' /tmp/passwd
exchange:x:8:12:mail:/var/spool/mail:/sbin/nologin
  • 替换一行中所有匹配到的字符串
#sed -n 's/mail/exchange/gp' /tmp/passwd
exchange:x:8:12:exchange:/var/spool/exchange:/sbin/nologin
  • 从每行匹配到的第2处开始替换
#sed -n 's/mail/MAIL/2p' /tmp/passwd
mail:x:8:12:MAIL:/var/spool/mail:/sbin/nologin
  • 在指定行前增加一条记录
    说明: 使用sed对文件进行插入内容时,仅对有行数的文件有效;类似于空文件(没有行记录),插入操作无效
#sed '2 i\***********************  ' /tmp/passwd
root:x:0:0:root:/root:/bin/bash
***********************
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
  • 在指定行后增加一条记录
#sed '2 a\***********************  ' /tmp/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
***********************
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
  • 通过管道接收上一条命令的输出并修改命令输出结果
#echo $LANG
en_US.UTF-8

#echo $LANG | sed  's/en_US/zh_CN/'
zh_CN.UTF-8
  • 注释文件中的所有行
#sed -i 's/^/#/' /tmp/passwd

#cat /tmp/passwd
#root:x:0:0:root:/root:/bin/bash
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
  • 删除文件中每行的第一个字符
#sed -i 's/^.//1' /tmp/passwd

#cat /tmp/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
  • 根据匹配到的内容注释指定的行
#sed -n 's/root/#root/p' /tmp/passwd
#root:x:0:0:root:/root:/bin/bash

与[转帖]Linux三剑客之sed的初阶使用相似的内容:

[转帖]Linux三剑客之sed的初阶使用

https://www.jianshu.com/p/ceea435635a2 大多数情况下,对于文件内容的修改需要依赖交互式的软件来实现,例如vim修改文件的内容则是依赖光标的移动和修改操作来完成对文件某一处内容的修改。然而,在linux操作系统中,也存在一种非交互式的方法来修改文件内容,通过发送特

[转帖]Linux文本处理三剑客之awk学习笔记05:getline用法详解

https://www.cnblogs.com/alongdidi/archive/2021/01/19/awkGetline.html getline用法详解 在默认情况下,awk支持从文件或者STDIN中读取数据。我们也可以使用getline来灵活读取数据,例如在main代码块执行过程中读取某个

[转帖]Linux文本处理三剑客之awk学习笔记05:getline用法详解

https://www.cnblogs.com/alongdidi/p/awkGetline.html getline用法详解 在默认情况下,awk支持从文件或者STDIN中读取数据。我们也可以使用getline来灵活读取数据,例如在main代码块执行过程中读取某个非待处理文件的数据,或者从某个读取

[转帖]Shell三剑客之awk

目录 awk简述awk的工作过程awk的工作原理awk的基本格式及其内置变量getline文本内容匹配过滤打印对字段进行处理打印条件判断打印awk的三元表达式与精准筛选用法awk的精准筛选:awk的分隔符用法指定输出的分隔符awk结合数组运用面试题 awk简述 在 Linux/UNIX 系统中,aw

[转帖]Linux-文本处理三剑客awk详解+企业真实案例(变量、正则、条件判断、循环、数组、分析日志)

https://developer.aliyun.com/article/885607?spm=a2c6h.24874632.expert-profile.313.7c46cfe9h5DxWK 简介: 文本处理 awk 1.awk简介 awk是一种编程语言,用于在Linux/unix下对文本和数据进

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

https://developer.aliyun.com/article/885609?spm=a2c6h.24874632.expert-profile.312.7c46cfe9h5DxWK 简介: sed读一行放到模式空间进行处理 sed是一种在线的、非交互式的编辑器,它一次处理一行内容,处理时

[转帖]Linux-文本处理三剑客grep详解

https://developer.aliyun.com/article/885611?spm=a2c6h.24874632.expert-profile.311.7c46cfe9h5DxWK 简介: grep家族 grep:在文件中全局查找指定的正则表达式,并打印所有包含该表达的行 egrep:扩

[转帖] jq命令用法总结

https://www.cnblogs.com/codelogs/p/16324928.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 简介# 如果说要给Linux文本三剑客(grep、sed、awk)添加一员的话,我觉得应该是jq命令,因为jq命令是用来处

[转帖]Linux 磁盘I/O 调度算法 说明

2022-08-23 13:031361转载Linux 1 Linux 4.0 IO协议栈框架图 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 Linux 4.0 IO协议栈框架图 I/O调度程序的总结 当向

[转帖]Linux中常见IO调度器

https://www.jianshu.com/p/3c16e39a005a 单队列调度算法多队列调度算法 deadline mqdeadlines cfq bfq noop none kyber 对于磁盘I/O,Linux提供了cfq, deadline和noop三种调度策略 cfq: 这个名字是