sed 常见用法

本文深入解析SED文本编辑器的增删改查功能,涵盖单行与多行插入、指定范围操作、删除、替换及查找技巧,适合初学者及进阶用户掌握SED命令的实用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                                   常见用法,增删改查

本文为转载,原文地址张耀的博客

  • 增加,插入

     i 插入到指定行

    a 追加到指定行后

 

  • 单行插入

[root@localhost ~]# cat persion.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed  '2i ceshi' persion.txt  #插入到第二行
101,oldboy,CEO
ceshi
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '2a ceshi' persion.txt  #追加到第二行之后
101,oldboy,CEO
102,zhangyao,CTO
ceshi
103,Alex,COO
104,yy,CFO
105,feixue,CIO

 

  • 多行插入

[root@localhost ~]# sed '2i ceshi\nceshi2' persion.txt   用\n换行符插入多行
101,oldboy,CEO               
ceshi
ceshi2
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '2a ceshi\nceshi2' persion.txt  
101,oldboy,CEO
102,zhangyao,CTO
ceshi
ceshi2
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@localhost ~]# sed '12a Port 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' sshd_config |grep -nvE "^$"
1:#     $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
3:# This is the sshd server system-wide configuration file.  See
4:# sshd_config(5) for more information.
6:# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
8:# The strategy used for options in the default sshd_config shipped with
9:# OpenSSH is to specify options with their default value where
10:# possible, but leave them commented.  Uncommented options change a
11:# default value.
13:Port 52113
14:PermitRootLogin no
15:PermitEmptyPasswords no
16:UseDNS no
17:GSSAPIAuthentication no
18:#Port 22                     用一条命令添加第13-17行,注意此时没有-i参数,文件是没有修改的
  • 指定执行的地址范围

sed软件可以对单行或多行进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行。
用法:n1[,n2]{sed-commands}
地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。
例子:
   10{sed-commands}        对第10行操作
   10,20{sed-commands}     对10到20行操作,包括第10,20行
   10,+20{sed-commands}   对10到30(10+20)行操作,包括第10,30行
   1~2{sed-commands}       对1,3,5,7,……行操作
                             从第一行开始,等差数列为2的行
   10,${sed-commands}     对10到最后一行($代表最后一行)操作,包括第10行
    /oldboy/{sed-commands}         对匹配oldboy的行操作
    /oldboy/,/Alex/{sed-commands}  对匹配oldboy的行到匹配Alex的行操作
    /oldboy/,${sed-commands}       对匹配oldboy的行到最后一行操作
    /oldboy/,10{sed-commands}      对匹配oldboy的行到第10行操作,注意:如果前10行没有匹配到oldboy,sed软件会显示10行以后的匹配oldboy的行,如果有。
    1,/Alex/{sed-commands}         对第1行到匹配Alex的行操作
    /oldboy/,+2{sed-commands}      对匹配oldboy的行到其后的2行,共计3行进行操作

 

  • 删除

 d 删除指定行

[root@oldboy ~]# sed 'd' person.txt
[root@oldboy ~]#
[root@oldboy ~]# sed '2d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '2,5d' person.txt
101,oldboy,CEO
[root@oldboy ~]# sed '3,$d' person.txt
101,oldboy,CEO
102,zhangyao,CTO
[root@oldboy ~]# sed '1~2d' person.txt
102,zhangyao,CTO
104,yy,CFO
[root@oldboy ~]# sed  '1,+2d' person.txt
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '/zhangyao/d' person.txt
101,oldboy,CEO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '/oldboy/,/Alex/d' person.txt
104,yy,CFO
105,feixue,CIO
[root@oldboy ~]# sed '/oldboy/,3d' person.txt
104,yy,CFO
105,feixue,CIO

  c 用新行取代旧行

[root@oldboy ~]# sed '2c 106,dandan,CSO' person.txt
101,oldboy,CEO
106,dandan,CSO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

s 文本替换  g全局替换

-i  修改文件内容

[root@localhost ~]# sed '2s/10/lumang/g' persion.txt  
101,oldboy,CEO
lumang2,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106
[root@localhost ~]# sed 's/10/lumang/g' persion.txt  
lumang1,oldboy,CEO
lumang2,zhangyao,CTO
lumang3,Alex,COO
lumang4,yy,CFO
lumang5,feixue,CIO
lumang6


sed 's/N1/N2/g'
N1,N2均可以使用变量
N1可以使用正则,N2不能用正则
  • 分组替换\( \)\1的使用说明

sed软件的\( \)的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

[root@localhost ~]# ifconfig eth0|sed -nr 's/^.*dr:(.*)  B.*$/\1/gp' 
192.168.111.132
-n 取消默认输出
-r 支持扩展正则,不加-r ,()要转义
's///gp'中的p是打印的意思

-n取消默认输出后,不加p不会输出内容
  •  特殊符号&代表被替换的内容

[root@localhost ~]# sed 's/oldboy/---&---/g' persion.txt 
101,---oldboy---,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

 


sed重命名文件


[root@localhost logs]# ls
stu_102999_1_finished.jpg  stu_102999_3_finished.jpg  stu_102999_5_finished.jpg
stu_102999_2_finished.jpg  stu_102999_4_finished.jpg

[root@localhost logs]# ls|sed -r 's/(.*)_finished.jpg/mv & \1.jpg/g' |bash
[root@localhost logs]# ls
stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg

 

p 输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出

 

[root@localhost ~]# sed '2p' persion.txt 
101,oldboy,CEO            
102,zhangyao,CTO           
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106
输出结果不是想要的第二行,而且第二行重复输出
[root@localhost ~]# sed '2p' persion.txt  -n
102,zhangyao,CTO
通常p和-n取消默认输出是一同出现
[root@localhost ~]# sed '2,3p' persion.txt  -n
102,zhangyao,CTO
103,Alex,COO
[root@localhost ~]# sed '2,/yy/p' persion.txt  -n 
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@localhost ~]# sed '/02/,/yy/p' persion.txt  -n 
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@localhost ~]# 

 

<think>嗯,用户想了解Linux中sed命令的详细用法和实例。首先,我需要回忆一下sed的基本功能和常见用途。sed是流编辑器,主要用于文本处理,比如替换、删除、插入等操作。用户可能已经知道一些基础,但需要更深入的指导,包括语法和例子。 接下来,我得组织回答的结构。通常,用户喜欢分步骤或分部分的内容,这样容易理解。可能分为简介、语法、常用命令、实例、高级技巧和常见问题这几个部分。不过用户提供的示例里引用了替换、删除、插入、行寻址等,可能这些是重点。 要注意用户提到的系统级指令,比如行内数学公式用$...$,但这里可能用不上。不过要确保中文回答,正确使用LaTeX格式,如果有数学表达式的话。但sed命令主要涉及文本处理,可能不需要数学公式,但如果有例子中的正则表达式,可能需要用代码块来展示。 用户还要求生成相关问题,我需要考虑用户可能进一步想知道的内容,比如sed和awk的区别,正则表达式的高级用法,或者如何调试sed脚本。这些可以作为相关问题放在最后。 现在检查用户提供的引用内容。引用[1]提到sed是强大的文本处理工具,结合正则表达式和多个命令。引用[2]提到高级用法,如分支命令和流程控制。所以,在回答中需要包括基础命令和高级用法,比如分支、循环,以及如何组合多个命令。 用户可能的需求包括实际例子,比如替换文件中的文本、删除特定行、插入内容等。需要给出具体的命令示例,并解释每个参数的作用。例如,替换命令s的用法,如何指定行范围,使用不同的分隔符等。 另外,用户可能对sed的工作流程不太清楚,比如读取行到模式空间,处理后再输出。需要简要说明sed的处理过程,这样用户能更好地理解命令的效果,尤其是在处理多行或保持空间时。 还要注意常见问题,比如原地编辑文件需要-i选项,处理特殊字符时的转义,以及如何同时执行多个命令。这些是用户在实际使用中可能会遇到的坑,需要提前说明。 在高级技巧部分,可以介绍正则表达式的分组、反向引用,以及使用标签控制流程。例如,如何跳过某些处理步骤,或者根据条件执行不同的命令。这些内容在引用[2]中提到了分支命令b,所以需要详细解释。 最后,生成的相关问题需要围绕用户可能进一步探索的方向,比如sed与其他工具的比较、复杂文本处理案例、调试技巧等。确保问题能够引导用户深入学习。 总结一下,回答的结构应该是:简介、语法结构、常用命令、实例演示、高级技巧、常见问题、相关问题。每个部分用简洁的语言和示例说明,确保用户能一步步掌握sed用法。同时,注意引用中的内容,适当融入高级用法的讲解,比如分支命令和流程控制,以增强回答的深度。</think>### Linux sed命令详解及实例教程 --- #### 一、sed命令简介 sed(Stream Editor)是Linux中基于文本流的非交互式编辑器,通过逐行处理输入流实现文本替换、删除、插入等操作,支持正则表达式[^1]。 --- #### 二、基本语法 ```bash sed [选项] '命令' 输入文件 ``` **常用选项**: - `-i`:直接修改文件内容(慎用) - `-n`:仅显示处理后的行 - `-e`:执行多条命令(如 `sed -e 's/a/A/' -e 's/b/B/'`) - `-r`:启用扩展正则表达式 --- #### 三、核心操作命令 1. **替换命令 `s`** ```bash sed 's/原内容/新内容/[修饰符]' file.txt ``` - **修饰符**: - `g`:全局替换(默认仅替换每行首个匹配) - `p`:打印替换后的行 - `i`:忽略大小写 - **实例**: ```bash # 将文件中的"apple"替换为"orange"(仅首个匹配) sed 's/apple/orange/' file.txt # 全局替换并保存文件 sed -i 's/apple/orange/g' file.txt ``` 2. **删除命令 `d`** ```bash # 删除第3行 sed '3d' file.txt # 删除包含"error"的行 sed '/error/d' file.txt ``` 3. **插入/追加命令 `i` 和 `a`** ```bash # 在第2行前插入内容 sed '2i\Insert this line' file.txt # 在匹配行后追加内容 sed '/pattern/a\Append this line' file.txt ``` 4. **行寻址** - **范围操作**:`起始行,结束行` ```bash # 删除1到5行 sed '1,5d' file.txt # 对包含"start"到"end"的行执行替换 sed '/start/,/end/s/old/new/g' file.txt ``` --- #### 四、高级用法 1. **正则表达式分组** ```bash # 交换第1列和第2列(使用分组和反向引用) sed 's/\([^ ]*\) \([^ ]*\)/\2 \1/' file.txt ``` 2. **多命令组合** ```bash # 删除空行并替换内容 sed -e '/^$/d' -e 's/foo/bar/g' file.txt ``` 3. **分支命令 `b`(流程控制)** ```bash # 若行包含"skip",跳过后续处理 sed '/skip/{b end;}; s/old/new/; :end' file.txt ``` --- #### 五、经典实例 1. **提取日志中的时间戳** ```bash sed -n 's/.*\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p' log.txt ``` 2. **批量重命名文件** ```bash ls *.txt | sed 's/\(.*\)\.txt/mv & \1.md/' | sh ``` 3. **处理多行文本** ```bash # 合并连续空行为单行 sed ':a; N; /\n$/ba; s/\n\+/\n/;' file.txt ``` --- #### 六、常见问题 1. **原地修改文件需谨慎**:使用 `-i` 前建议先备份或测试命令。 2. **特殊字符转义**:若替换内容含 `/`,可改用其他分隔符(如 `s#old#new#`)。 3. **性能优化**:处理大文件时避免频繁写操作,优先使用流式处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值