linux 命令之 sed

本文介绍SED流编辑器的基础用法,包括文本的增删改查、正则表达式匹配及替换,展示了如何通过SED处理文件和管道输入,实现文本过滤和转换。

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

sed 是 一种流编辑器。

这里给出 man sed 描述:

NAME
       sed - stream editor for filtering and transforming text

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

DESCRIPTION
       Sed  is a stream editor.  A stream editor is used to perform basic text
       transformations on an input stream (a file or input from  a  pipeline).
       While  in  some  ways similar to an editor which permits scripted edits
       (such as ed), sed works by making only one pass over the input(s),  and
       is consequently more efficient.  But it is sed's ability to filter text
       in a pipeline which particularly distinguishes it from other  types  of
       editors.

简单说下, sed 是一种流编辑器。然后说了下,流编辑器一般用来干嘛 —— 一般用来处理输入流(文件或输入管道)的文本处理。sed 在管道文本过滤方面的能力是明显区别于其它编辑器的地方。

sed 命令的参数还是比较多的,这里说下几个常见的选项参数用法。

为了实验方便,首先写进去一段文本内容:

zhang@zhang:~$ cat >>sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ 

先说下最基本的"增删改查" 

 a  (如果指定了行的话,在指定行下面追加一行,没有指定就在每行下面)追加文本

zhang@zhang:~$ echo "新增一行"
新增一行
zhang@zhang:~$ sed '1a 这是sed 案例的开始' sed.txt
hello,world
 这是sed 案例的开始
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ 

  上面的 1a的意思是从在第1行下面追加一段文本。   

 d 删除指定的行,如果没有指定,那么会全部删除

zhang@zhang:~$ echo "演示删除第1行"
演示删除第1行
zhang@zhang:~$ sed '1d' sed.txt
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ 

 

zhang@zhang:~$ echo '不加行号,会全部删除'
不加行号,会全部删除
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ sed 'd' sed.txt | tee delete.txt
zhang@zhang:~$ cat delete.txt

 不知道你有没有发现,我们上面的操作,并没有对源文件的内容发生影响,如果你想同步操作到文件,可以加 i 参数,有风险慎用。

 

zhang@zhang:~$ echo "展示 i 参数 ,直接修改源文件"
展示 i 参数 ,直接修改源文件
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
don
e
zhang@zhang:~$ sed -i "5,6d" sed.txt
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ 

可以看到上面删除第5,6 行的操作,直接同步到了文件上的。

 s 替换指定字符

zhang@zhang:~$ echo "展示替换操作"
展示替换操作
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ sed 's/world/xiaomu xizi/' sed.txt
hello,xiaomu xizi
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ 

 忘记说了,sed基本上是正则模式匹配,所以需要一点正则知识,才能把 sed 玩6.

 还可以加上个  g  ,来个全局匹配替换

zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ sed 's/blog/zhang/g' sed.txt
hello,world
my zhang name is xiaomu xizi 
my zhang address is zhang.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ 

  p 打印当前模式匹配行 

 

zhang@zhang:~$ echo "演示查找操作"
演示查找操作
zhang@zhang:~$ cat sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ sed '/zhang/p' sed.txt
hello,world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
zhang@zhang:~$ 

 可以看到,匹配结果显示在了匹配行的下面,那如何只显示处理结果呢?可以使用 -n  

 

 -n, --quiet, --silent ,仅显示处理后的结果

zhang@zhang:~$ sed '/zhang/p' sed.txt -n
my blog address is blog.youkuaiyun.com/zhang_referee
zhang@zhang:~$ 

 可以看到我在栗子中,""(双引号) 和 '' (单引号) 交替使用,是想在这里说下,单双引号无所谓。

  我们在上面插入的时候适用的是 a 命令,是在指定行下面插入数据,也可以在指定行前面插入数据。

   i insert text, which has each embedded newline preceded by a backslash.

 

[root@ ~]# sed '1i hello world' sed.txt
hello world
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing

a 命令是在行后面追加,i 命令是在行前插入

 

 已匹配字符串标记&

 我们把下面的blog ,替换成--blog--

 

[root@iZwz9dl2kxe9e85u1h5cl6Z ~]# cat sed.txt
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
[root@iZwz9dl2kxe9e85u1h5cl6Z ~]# sed 's/blog/--&--/g' sed.txt
my --blog-- name is xiaomu xizi 
my --blog-- address is --blog--.youkuaiyun.com/zhang_referee
I love programming and writing
[root@iZwz9dl2kxe9e85u1h5cl6Z ~]# 

 还可以指定要替换的行号:

[root@i6Z ~]# cat sed.txt
my blog name is xiaomu xizi 
my blog address is blog.youkuaiyun.com/zhang_referee
I love programming and writing
[root@i6Z ~]# sed '2s/blog/--&--/g' sed.txt
my blog name is xiaomu xizi 
my --blog-- address is --blog--.youkuaiyun.com/zhang_referee
I love programming and writing
[root@i6Z ~]# 

 

上面就是sed 的基本操作,sed 是一款很强大的文本处理工具,结合正则表达式能完成很多复杂操作,但由于历史原因,sed 默认只支持基础正则,要想支持扩展正则,

   -r, --regexp-extended

              use extended regular expressions in the script.

 请使用 -r 参数。

  这里使用 sed 结合基础正则 ,来完成对html 标签的过滤。

zhang@zhang:~$ cat >> index.html
<html> 
<head>
<title>
document
</title>
</head>
<body>
<p> hello , xiao mu xi zi </p>
<h1> this is a html document</h1> 
</body>
</html>
zhang@zhang:~$ cat index.html
<html>
<head>
<title>
document
</title>
</head>
<body>
<p> hello , xiao mu xi zi </p>
<h1> this is a html document</h1>
</body>
</html>
zhang@zhang:~$ echo "过滤标签,提取文本"
过滤标签,提取文本
zhang@zhang:~$ sed 's/<[^<>]*>//g'  index.html



document



 hello , xiao mu xi zi 
 this is a html document


zhang@zhang:~$ 

 

这里只介绍了,sed 的基础用法,更多用法,请参考 man sed 。我个人建议是,要玩好 sed  ,正则表达式要玩的 6 才行的。也可以参考这个链接,讲的比较全:http://man.linuxde.net/sed

### 回答1: sed是一个强大的文本处理工具,常用于从标准输入或文件中读取文本,进行编辑和转换,并将输出写入标准输出或文件中。 以下是sed常用的命令选项: 1. -n:只显示经过sed编辑的行 2. -i:直接修改文件内容,不输出到终端 3. -e:允许多个命令一起执行 4. -f:从文件中读取sed命令进行处理 以下是sed常用的命令: 1. s:替换。语法为:s/要替换的内容/替换后的内容/g,其中g表示全局替换。 2. p:打印。将指定的行或所有行输出到终端。 3. d:删除。删除指定的行或所有行。 4. a:追加。在指定行后面添加新的内容。 5. i:插入。在指定行前面插入新的内容。 6. w:写入。将指定行写入到文件中。 举例说明: 1. 将文件中的所有"cat"替换为"dog":sed -i 's/cat/dog/g' file.txt 2. 只显示文件中包含“hello”的行:sed -n '/hello/p' file.txt 3. 删除文件中的第3行:sed -i '3d' file.txt 4. 在文件中第2行后面添加一行内容:“hello world”:sed -i '2a hello world' file.txt 5. 将文件中第1行替换为“hello”并保存到另一个文件中:sed '1s/.*/hello/' file.txt > newfile.txt ### 回答2: sed是一种常用的Linux命令,其全称为Stream Editor,用于对文本进行处理和转换。它可以在命令行中以各种方式对文件内容进行修改,包括替换、插入、删除、追加等操作。 sed的基本语法是`s/old/new/`,其中old表示待替换的字符串,new表示替换后的内容。sed命令会读取文件的内容,并对匹配到的old进行替换。如果需要对整个文件进行替换,则需要加上选项`-i`。 除了替换以外,sed还可以实现很多其他的文本操作。例如,通过`d`选项可以删除匹配到的行;通过`i`选项可以在指定行前插入文本;通过`a`选项可以在指定行后追加文本等。 另外,sed命令还可以使用正则表达式来进行模式匹配。通过在替换语句中使用正则表达式,可以对符合特定模式的字符串进行批量替换。 总之,sed是一种非常强大和灵活的文本处理工具,可以方便地对文件内容进行修改和转换,提高工作效率。熟练掌握sed命令可以帮助我们更好地处理和编辑文本文件。 ### 回答3: sed(Stream Editor)是Linux中常用的文本处理工具之一。它可以对文本进行流式编辑,具体操作包括查找、删除、替换、插入行或字符等。 使用sed命令的基本语法为: ``` sed [选项] '动作' 文件名 ``` 其中,选项可以包括: - -n:只显示或处理特定行; - -e:指定要执行的动作; - -f:从指定文件中读取动作。 动作部分可以包括: - 数字n:表示打印第n行; - p:打印匹配行; - d:删除匹配行; - s/old/new/:查找并替换文本; - a\text:在匹配行后插入文本; - i\text:在匹配行前插入文本。 以下是一些常用的sed命令示例: - 打印文件内容: ``` sed 'p' file.txt ``` - 删除匹配行: ``` sed '/pattern/d' file.txt ``` - 查找并替换文本: ``` sed 's/old/new/' file.txt ``` - 打印指定行数: ``` sed -n 'n' file.txt ``` - 在匹配行后插入文本: ``` sed '/pattern/a\text' file.txt ``` - 在匹配行前插入文本: ``` sed '/pattern/i\text' file.txt ``` 通过灵活运用sed命令,我们可以轻松地对文本文件进行各种编辑操作,提高工作效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值