Linux sed命令用法说明

本文深入解析SED文本处理工具的使用方法,涵盖基本功能、语法格式、常用选项及具体命令,如增加、删除、查找和替换文本内容。通过实例演示如何利用SED进行高效的文本编辑和模式匹配。

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

1 功能说明

        sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或者加入i参数。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
        小结:sed的功能是,对字符串进行增加、删除、改变、查找,即增删改查!

2 语法格式

sed [optian] [sed-command] [input-file]

# 注意sed和后面的选项之间至少有一个空格。
# 为了避免混淆,称呼sed为sed软件。sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令。
# sed-commands既可以是单个sed命令,也可以是多个sed命令组合。
# input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。

3 常用选项

测试文本内容为:

[root@lixin ~]# cat daxin.txt 
I am daxin teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://daxin.blog.51cto.com
our site is http://www.cnblogs.org
my qq num is 49000448.

not 4900000448.
my god ,i am not dachenzi,but daxin!
gd
good
gooood
[root@lixin ~]#

3.1 取消标准输出

-n:表示取消标准输出(默认情况下sed替换后会把文件所有内容包括更改过的内容一起输出到屏幕上,我们使用-n后,让它只输出匹配表达式的字符串,一般和p连用,p表示print,打印表达式结果)。

[root@lixin ~]# sed  '/old/p' daxin.txt    
I am daxin teacher!
I am daxin teacher!
I teach linux.

I like badminton ball ,billiard ball and chinese chess!
my blog is http://daxin.blog.51cto.com
my blog is http://daxin.blog.51cto.com
our site is http://www.cnblogs.org
my qq num is 49000448.

not 4900000448.
my god ,i am not dachenzi,but daxin!
my god ,i am not dachenzi,but daxin!
gd
good
gooood
[root@lixin ~]# sed  -n '/old/p' daxin.txt 
I am daxin teacher!
my blog is http://daxin.blog.51cto.com
my god ,i am not dachenzi,but daxin!
[root@lixin ~]#     //-n和p连用后表示只打印符合表达式规则的行

3.2 支持扩展正则表达式

-r:参数用来支持扩展正则表达式,比如{}符号,如果不加-r参数需要使用\来进行转意。

[root@lixin ~]# sed -n '/o\{1,2\}/p' daxin.txt 
I am daxin teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://daxin.blog.51cto.com
our site is http://www.cnblogs.org
not 4900000448.
my god ,i am not dachenzi,but daxin!
good
gooood
[root@lixin ~]# sed -nr '/o{1,2}/p' daxin.txt    
I am daxin teacher!
I like badminton ball ,billiard ball and chinese chess!
my blog is http://daxin.blog.51cto.com
our site is http://www.cnblogs.org
not 4900000448.
my god ,i am not dachenzi,but daxin!
good
gooood
[root@lixin ~]#  //表达式含义:o最少重复1次,最多重复2次

3.3 直接修改文件内容

-i:表示直接对目标文件进行操作(增删改查),加上这个参数之后,不会在屏幕上输出信息,会直接对源文件进行更改(慎用)。

[root@lixin ~]# sed -i '/^$/d' daxin.txt   //直接删除文件内的空行,并没有打印。
[root@lixin ~]# cat daxin.txt  
I am daxin teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://daxin.blog.51cto.com
our site is http://www.cnblogs.org
my qq num is 49000448.
not 4900000448.
my god ,i am not dachenzi,but daxin!
gd
good
gooood
[root@lixin ~]#

4 sed-command

测试文本内容为:

[root@lixin ~]# cat study.txt 
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

4.1 增加

-i:表示插入,插入到目标行之前。

[root@lixin ~]# sed '2i she is a girl' study.txt 
1,I am a Linux student
she is a girl
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#   //2i表示在第二行插入,不加行号表示在每一行之前插入

-a:表示在目标行之后添加

[root@lixin ~]# sed  '3a he is a boy' study.txt  
1,I am a Linux student
2,I am studying Linux
3,I like movice
he is a boy
4,I am super man
5,I like computer games
[root@lixin ~]#

多行增加

# 方法一:利用\n,表示换行符
[root@lixin ~]# sed '2i 1\n2\n3' study.txt 
1,I am a Linux student
1
2
3
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

# 方法二:利用shell特性(\回车)表示接着下一行。
[root@lixin ~]# sed '2i 1\
> 2\
> 3 \' study.txt
1,I am a Linux student
1
2
3
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

4.1.1 限定区域添加

sed软件可以对单行或多行进行处理。如果在sed命令前面不指定地址范围,那么默认会匹配所有行。

n1[,n2]{sed-commands}
# 注:地址用逗号分隔的,n1,n2可以用数字、正则表达式、或二者的组合表示。

例子:
n{sed-commands} 对第n行操作。

[root@lixin ~]# sed '5c she is a girl ' study.txt 
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
she is a girl 
[root@lixin ~]#   //表示针对第武行进行替换,替换为she is a girl

n,m{sed-commands}对n到m行操作,包括第n,m行。

[root@lixin ~]# sed '2,4c she is a girl ' study.txt 
1,I am a Linux student
she is a girl 
5,I like computer games
[root@lixin ~]#   //表示把2到4行替换成she is a girl。
```   
`n,+m{sed-commands}`对n到n+m行操作,包括第n,m行
```bash
[root@lixin ~]# sed '2,3d' study.txt 
1,I am a Linux student
4,I am super man
5,I like computer games
[root@lixin ~]# //表示2到3行删除

1~2{sed-commands} 对1,3,5,7,……行操作

[root@lixin ~]# sed '2~2d' study.txt  
1,I am a Linux student
3,I like movice
5,I like computer games
[root@lixin ~]#   //表示对2,4,6,8等偶数行进行操作

n,${sed-commands} 对n到最后一行($代表最后一行)操作,包括第n行

[root@lixin ~]# sed '2,$d' study.txt 
1,I am a Linux student
[root@lixin ~]# //删除2行到$(尾行)

/Linux/{sed-commands} 对匹配daxin的行操作

[root@lixin ~]# sed '/Linux/d' study.txt 
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#   //表示把包涵Linux的行删掉

/Linux/,/movice/{sed-commands}对匹配daxin的行到匹配Alex的行操作

[root@lixin ~]# sed '/Linux/,/movice/d' study.txt  
4,I am super man
5,I like computer games
[root@lixin ~]#   //表示把第一个包涵Linux到第一个包涵movice的行删掉

/movice/,${sed-commands}对匹配daxin的行到最后一行操作

[root@lixin ~]# sed '/movice/,$d' study.txt 
1,I am a Linux student
2,I am studying Linux
[root@lixin ~]# //表示从movice到最后一行删掉

/games/,10{sed-commands}对匹配daxin的行到第10行操作,注意:如果前10行没有匹配到daxin,sed软件会显示10行以后的匹配daxin的所有行,如果有。

[root@lixin ~]# sed '/games/,4d' study.txt    
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
[root@lixin ~]#

1,/am/{sed-commands} 对第1行到匹配Alex的行操作

[root@lixin ~]# sed '1,/am/d' study.txt 
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#   //表示从1行到第一个匹配到am的行删除

/student/,+2{sed-commands} 对匹配daxin的行到其后的2行操作

[root@lixin ~]# sed '/student/,+2d' study.txt 
4,I am super man
5,I like computer games
[root@lixin ~]# //表示从匹配student的第一项到它的后两行进行删除

4.2 删除

-d:表示删除,可以直接删除行,可以删除包涵关键字的行

[root@lixin ~]# sed '2d' study.txt 
1,I am a Linux student
3,I like movice
4,I am super man
5,I like computer games
games       //删除第2行
[root@lixin ~]# sed '/am/d' study.txt 
3,I like movice
[root@lixin ~]#   //删除包涵am的行

4.3 查找

p表示打印,把符合我们表达式的项目打印出来,由于sed默认输出所有,再使用拍的话会打印两遍,所以一般和-n参数连用,表示只打印匹配到的行。

[root@lixin ~]# sed '/am/p' study.txt  //由于没有-n所以会把匹配到的行和默认输出一起打印
1,I am a Linux student
1,I am a Linux student
2,I am studying Linux
2,I am studying Linux
3,I like movice
4,I am super man
4,I am super man
5,I like computer games
5,I like computer games
games
games
[root@lixin ~]# sed -n '/am/p' study.txt  //-n取消默认输出,p打印,所以只显示匹配项
1,I am a Linux student
2,I am studying Linux
4,I am super man
5,I like computer games
games
[root@lixin ~]# sed –nr ‘/am|student/’ study.txt  //查找包含am或student的行
1,I am a Linux student
[root@lixin ~]# sed -n '2p' study.txt 
2,I am studying Linux
[root@lixin ~]#   //只显示第二行

4.4 改

-c:按行替换,表示一次替换一整行的内容。

[root@lixin ~]# sed '1c she is a girl' study.txt 
she is a girl
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
games
[root@lixin ~]# //表示把第1行,替换成she is a girl 

4.4.1 文本替换

s:表示全局查找某个关键字,并替换每行第一个匹配项。
g:表示全局替换,不属于sed命令,一般搭配s使用。

# 格式:
sed  ‘s#1#2#g’
#:表示定界符,可以是/、@、或者其他成对符号。
# 1:表示要替换的源文件中的字符串(可以是正则表达式)。
# 2:表示要替换成的文件,必须是给定的字符串。

文本替换实例:

[root@lixin ~]# !ca
cat study.txt 
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]# sed  '1s#a#b#' study.txt    //把第一个a替换为b
1,I bm a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#
[root@lixin ~]# sed  '1s#a#b#g' study.txt  //把第一行所有a替换为b
1,I bm b Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#

变量替换实例:

[root@lixin ~]# n=a       //设定变量n的值为a
[root@lixin ~]# m=c     //设定变量m的值为c
[root@lixin ~]# echo $n   //验证变量n的值
a
[root@lixin ~]# echo $m   //验证变量b的值
c
[root@lixin ~]# sed '1s#$n#$m#g' study.txt  //由于’’单引号,不解释内部变量值所以没有替换
1,I am a Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]# sed "1s#$n#$m#g" study.txt  // “” 双引号表示引用内部的变量,所以替换了 
1,I cm c Linux student
2,I am studying Linux
3,I like movice
4,I am super man
5,I like computer games
[root@lixin ~]#  //表示可以利用变量的值来对字符串进行过滤或替换(必须用””双引号)

4.4.2 后向引用

        sed软件的( )的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。这种在后面调用的方式,叫做后向引用。

# 格式:
sed ‘s#()()#\1\2#g’
# 第一个()表示第一项,第二个()表示第二项,一次类推,最多九个,不想匹配的可以写在括号后面。
# \1表示引用前面第一个()括号内的内容,\2表示引用前面第二个()括号内的内容。

实例:

# 获取ip地址信息
[root@lixin ~]# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0C:29:E4:83:06  
    inet addr:10.0.0.8  Bcast:10.0.0.255  Mask:255.255.255.0
    inet6 addr: fe80::20c:29ff:fee4:8306/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    RX packets:981 errors:0 dropped:0 overruns:0 frame:0
    TX packets:562 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000 
    RX bytes:85039 (83.0 KiB)  TX bytes:62853 (61.3 KiB)
[root@lixin ~]# ifconfig eth0 | sed -nr '2s#^.*r:(.*).?B.*$#\1#gp'
10.0.0.8  
[root@lixin ~]#
# ^.*r: 表示以任意字符开头到r:为止。
# (.*) 表示任意字符,这里就是我们要取得ip信息。
# .?B.*$ ,.?表示匹配任意两个字符,B.*$表示从B到结尾。

特殊符号的使用:
批量进行文件后缀名更改

[root@lixin lixin]# ls 
LinuxAdministartor10.bak  LinuxAdministartor2.bak  LinuxAdministartor4.bak  LinuxAdministartor6.bak  LinuxAdministartor8.bak
LinuxAdministartor1.bak   LinuxAdministartor3.bak  LinuxAdministartor5.bak  LinuxAdministartor7.bak  LinuxAdministartor9.bak
[root@lixin lixin]# ls | sed -nr 's#(^L.*[0-9])(.*$)#mv & \1.txt#gp'
mv LinuxAdministartor10.bak LinuxAdministartor10.txt
mv LinuxAdministartor1.bak LinuxAdministartor1.txt
mv LinuxAdministartor2.bak LinuxAdministartor2.txt
mv LinuxAdministartor3.bak LinuxAdministartor3.txt
mv LinuxAdministartor4.bak LinuxAdministartor4.txt
mv LinuxAdministartor5.bak LinuxAdministartor5.txt
mv LinuxAdministartor6.bak LinuxAdministartor6.txt
mv LinuxAdministartor7.bak LinuxAdministartor7.txt
mv LinuxAdministartor8.bak LinuxAdministartor8.txt
mv LinuxAdministartor9.bak LinuxAdministartor9.txt
[root@lixin lixin]# ls | sed -nr 's#(^L.*[0-9])(.*$)#mv & \1.txt#gp' | bash
[root@lixin lixin]# ls
LinuxAdministartor10.txt  LinuxAdministartor2.txt  LinuxAdministartor4.txt  LinuxAdministartor6.txt  LinuxAdministartor8.txt
LinuxAdministartor1.txt   LinuxAdministartor3.txt  LinuxAdministartor5.txt  LinuxAdministartor7.txt  LinuxAdministartor9.txt
[root@lixin lixin]#
# &符号表示前面两个分隔符中间的所有内容
#shell的命令都是bash在执行,所以把命令拼出来后直接交给bash处理即可

5 特定含义的符号

5.1 =

在sed中=号表示显示行号,但是会换行显示,只是显示行号可以省略“”(引号)。

[root@lixin daxin]# head -n 3 /etc/passwd | sed =
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
[root@lixin daxin]#

5.2 l

在sed中l表示显示隐藏字符,只是显示隐藏符号可以省略“”(引号)

[root@lixin daxin]# head -3 /etc/passwd | sed -n l 
root:x:0:0:root:/root:/bin/bash$
bin:x:1:1:bin:/bin:/sbin/nologin$
daemon:x:2:2:daemon:/sbin:/sbin/nologin$
[root@lixin daxin]#

5.3 {}

在sed中,{}符号表示要执行的sed内置command的集合,之间用;(分号)隔开。

[root@lixin daxin]# sed -n '10,20{=;p}' /etc/passwd   
10
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11
operator:x:11:0:operator:/root:/sbin/nologin
12
games:x:12:100:games:/usr/games:/sbin/nologin
13
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
14
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
15
nobody:x:99:99:Nobody:/:/sbin/nologin
16
dbus:x:81:81:System message bus:/:/sbin/nologin
17
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
18
abrt:x:173:173::/etc/abrt:/sbin/nologin
19
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
20
ntp:x:38:38::/etc/ntp:/sbin/nologin
[root@lixin daxin]#  //{=;p}表示,先打印行号,在输出

5.4 G

在sed中G表示在一行后面追加一行空行。

[root@lixin daxin]# head -n 3 /etc/passwd | sed G
root:x:0:0:root:/root:/bin/bash

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

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

[root@lixin daxin]#
<think>好的,用户想了解Linuxsed命令使用教程和示例。首先,我需要回忆一下sed的基本功能和常用选项。sed主要用于流式文本处理,可以实现替换、删除、插入等操作。用户可能希望看到结构化的讲解,比如命令格式、常用选项、示例等。 首先,我应该解释sed的基本结构,比如命令格式:`sed [选项] '操作指令' 文件`。然后列出常用的选项,比如-n、-i、-e等,每个选项的作用需要简明扼要地说明。 接下来是操作指令部分,用户可能需要知道如何替换、删除、插入等。替换命令s是最常用的,需要详细说明语法,比如`s/原字符串/替换字符串/修饰符`,并举例说明不同修饰符的作用,如g全局替换,p打印等。 然后,用户可能需要具体的示例来理解这些命令。比如删除空行、替换文本、插入行等。要注意示例的多样性,覆盖不同的使用场景,比如处理文件、结合正则表达式等。同时,结合用户提供的引用内容,确保示例准确,比如引用[1]中的删除空行示例,引用[4]中的原地编辑文件。 还要注意用户提到的注意事项,比如-i选项的风险,正则表达式的转义问题,这些都需要在教程中提醒用户,避免常见错误。此外,用户提供的引用中有多个示例,可以整合到回答中,比如查找特定行、多命令执行等。 最后,生成相关问题,帮助用户进一步学习,比如sed的高级用法、正则表达式技巧、与其他命令的配合使用等。这些问题应该覆盖用户可能感兴趣的扩展知识点,参考引用中的内容,比如引用[2]中的替换空格示例,引用[3]中的复杂正则处理。 整个过程中需要确保使用中文,LaTeX格式正确,行内公式用$...$,独立公式用$$...$$,但可能在这个问题中公式使用较少,主要关注命令示例的结构和格式。检查是否有遗漏的重要sed功能,比如模式空间和保持空间,但根据用户提供的引用,可能不需要深入这些高级话题,保持教程基础实用即可。</think>### Linux sed命令使用教程及示例 #### 一、sed命令基础 **sed**(Stream Editor)是Linux中基于文本流的非交互式编辑器,通过指令对文本进行批量处理,支持正则表达式。其基本格式为: ``` sed [选项] '操作指令' 文件 ``` #### 二、常用选项 | 选项 | 功能 | |------|------| | `-n` | 仅显示处理后的行(需配合`p`指令) | | `-i` | 直接修改文件内容(慎用,建议先备份) | | `-e` | 执行多条指令(例如:`-e 's/a/A/' -e 's/b/B/'`) | | `-f` | 从文件读取指令(例如:`sed -f script.sed file`)[^4] | #### 三、核心操作指令 1. **替换**:`s/原字符串/替换字符串/修饰符` - 示例:`sed 's/old/new/g' file.txt`(全局替换`old`为`new`) - 修饰符: - `g`:全局替换 - `p`:打印匹配行(需与`-n`配合) - `i`:忽略大小写(例如:`s/hello/HELLO/gi`) 2. **删除**:`d` - 示例:`sed '/^$/d' file.txt`(删除所有空行)[^1] 3. **插入/追加**: - `i\`:在匹配行前插入 - `a\`:在匹配行后追加 - 示例:`sed '/aa/a\INSERT_LINE' file.txt`(在包含`aa`的行后插入新行) 4. **打印**:`p` - 示例:`sed -n '/proxy_pass/p' nginx.conf`(仅打印包含`proxy_pass`的行)[^1] #### 四、典型应用示例 1. **删除空行及注释行**: ```bash sed '/^#/d; /^$/d' file.txt # 删除以#开头的行和空行 ``` 2. **批量替换文件内容**: ```bash find . -name "*.sh" -exec sed -i '1c#!/bin/bash' {} \; # 将所有.sh文件首行替换为#!/bin/bash[^1] ``` 3. **正则表达式替换**: ```bash sed -E 's/[0-9]{4}-[0-9]{2}-[0-9]{2}/DATE/g' log.txt # 将日期格式替换为DATE ``` 4. **多指令组合**: ```bash sed -e 's/fuck//g' -e 's/草//g' file.txt # 删除敏感词[^1] ``` #### 五、注意事项 1. **备份文件**:使用`-i`前建议先执行`cp file.txt file.txt.bak`。 2. **正则转义**:特殊字符如`.`需转义为`\.`。 3. **性能优化**:处理大文件时避免频繁写入,可结合管道与其他命令(如`grep`、`awk`)配合使用--- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值