Unix Sed命令

1. 前言

本文主要讲解Linux系统中的sed命令的作用与使用案例。

sed用于查找、过滤、文本替换、替换和插入、删除等文本操作。它是Linux/Unix系统提供的强大实用程序之一。我们可以在正则表达式中使用sed。使用sed命令之前,您应该至少对Linux正则表达式有基本的了解。

它提供了文本文件的非交互式编辑,这就是为什么它被用来自动编辑。它有两个缓冲区-pattern buffer和hold buffer。sed在逐行读取文件时使用pattern buffer,并且将当前读取的行插入到pattern buffer中,而hold buffer是一个长期存储,它捕获信息,存储信息,并在需要时重用这些信息。最初,两者都是空的。SED命令用于执行不同的操作,甚至可以不打开文件。

首先创建a.txt文件,我将在该文件上执行sed命令的操作。在本教程中,我使用了a.txt文件解释了所有的例子。如果我编写每个sed命令的输出,本文就会变得太长。因此,您可以先引用同一个文件来练习所有的命令。

查看a.txt的文本内容:

[root@rhel7 ~]# cat a.txt

Bash

Copy

输出如下:

life isn't meant to be easy, life is meant to be lived.
Try to learn & understand something new everyday in life.
Respect everyone & most important love everyone.
Don’t hesitate to ask for love & don’t hesitate to show love too.
Life is too short to be shy.
In life experience will help you differentiating right from wrong.

2. 使用基本sed命令操作文件

2.1 在每一行后面插入一行空白

[root@rhel7 ~]# sed G a.txt

Bash

Copy

2.2 在每一行后面插入两行空白

[root@rhel7 ~]# sed 'G;G' a.txt

Bash

Copy

2.3 删除空行,并在每一行之后插入一个空行

[root@rhel7 ~]# sed '/^$/d;G' a.txt

Bash

Copy

2.4 在匹配“love”的每一行上插入空行

[root@rhel7 ~]# sed '/love/{x;p;x;}' a.txt

Bash

Copy

2.5 在匹配“love”的每一行下面插入空行

[root@rhel7 ~]# sed '/love/G' a.txt

Bash

Copy

2.6 在每一行的左边插入5个空格

[root@rhel7 ~]# sed 's/^/     /' a.txt

Bash

Copy

3. 行编号

给文件的每一行标上序号(左对齐)。=用于给行编号。\t用于数字和句子之间的制表符(TAB)

[root@rhel7 ~]# sed =  a.txt | sed 'N;s/\n/\t/'

Bash

Copy

给文件的每一行编号(左对齐,右对齐)。这个命令类似于cat -n filename

[root@rhel7 ~]# sed = a.txt | sed 'N; s/^/     /; s/ *\(.\{4,\}\)\n/\1  /'

Bash

Copy

为文件的每一行编号,空行除外:

[root@rhel7 ~]#  sed '/./=' a.txt | sed '/./N; s/\n/ /'

Bash

Copy

4. 删除指定行

删除特定行
语法:

sed ‘nd’ filename

Bash

Copy

例如:

[root@rhel7 ~]# sed '5d' a.txt

Bash

Copy

删除最后一行
语法:

sed ‘$d’ filename

Bash

Copy

删除从x到y的行

语法:

sed ‘x,yd’ filename

Bash

Copy

[root@rhel7 ~]# sed '3,5d' a.txt

Bash

Copy

从第N行开始删除
语法:

sed ‘nth,$d’ filename

Bash

Copy

例如:

[root@rhel7 ~]# sed '2,$d' a.txt

Bash

Copy

删除内容匹配的行:
语法:

sed ‘/pattern/d’ filename

Bash

Copy

例如:

[root@rhel7 ~]# sed '/life/d' a.txt

Bash

Copy

删除从第n行开始的行以及从第n行开始的第2行

语法:

sed ‘n~2d’ filename

Bash

Copy

例如:

[root@rhel7 ~]# sed '3~2d' a.txt

Bash

Copy

删除与内容匹配的行以及后面的两行
语法:

sed ‘/pattern/,+2d’ filename

Bash

Copy

例子:

[root@rhel7 ~]# sed '/easy/,+2d' a.txt

Bash

Copy

删除空行:

[root@rhel7 ~]# sed '/^$/d' a.txt

Bash

Copy

删除空行或以“#”开头的行

[root@rhel7 ~]# sed -i '/^#/d;/^$/d' a.txt

Bash

Copy

5. 查看或打印文件

如果我们想查看文件的内容,那么我们使用cat命令,如果我们想查看任何文件的底部和顶部内容,我们使用headtail等工具。但是,如果我们需要查看文件中间的特定部分,该怎么办呢?在这里,我们将讨论如何使用sed命令来查看文件指定部分。

查看文件x到y行的内容:
语法:

sed -n ‘x,yp’ filename

Bash

Copy

例子:

[root@rhel7 ~]# sed -n '2,5p' a.txt

Bash

Copy

查看除给定范围之外的整个文件内容:
语法:

sed ‘x,yd’ filename

Bash

Copy

例如:
打印文件,除了第2和第4行。

[root@rhel7 ~]# sed '2,4d' a.txt

Bash

Copy

打印文件的第n行
语法:

sed -n ‘address’p filename

Bash

Copy

例子:

[root@rhel7 ~]# sed -n '4'p a.txt

Bash

Copy

从第x行打印到第y行。
语法:

sed -n ‘x,y’p filename

Bash

Copy

例子:

[root@rhel7 ~]# sed -n '4,6'p a.txt

Bash

Copy

只打印最后一行
语法:

sed -n '$'p filename

Bash

Copy

例如:

[root@rhel7 ~]# sed -n '$'p a.txt

Bash

Copy

打印文件,从第n行到文件结束
语法:

sed -n ‘n,$p’ filename

Bash

Copy

例如:

sed -n '3,$'p a.txt

Bash

Copy

6. 打印匹配内容

只打印与指定匹配内容的行

语法:

sed -n /pattern/p filename

Bash

Copy

例子:

[root@rhel7 ~]# sed -n /every/p a.txt

Bash

Copy

打印与指定内容匹配的行。例如从匹配行到第x行。
语法:

sed -n ‘/pattern/,xp’ filename

Bash

Copy

例子:
接下来打印与指定内容匹配的行,第三行打印与指定内容everyone匹配的行,因此它从第3行打印到第5行。如果要打印文件直到结束,请使用$来代替5

[root@rhel7 ~]# sed -n '/everyone/,5p' a.txt

Bash

Copy

打印第x行到匹配的行,如果没有找到匹配内容,则打印到文件的最后。
语法:

sed -n ‘x,/pattern/p’ filename

Bash

Copy

例如:

sed -n '1,/everyone/p' a.txt

Bash

Copy

从匹配的内容开始打印往下打印N行(不包括匹配行)

sed -n ‘/pattern/,+xp’ filename

Bash

Copy

例子:

sed -n '/learn/,+2p' a.txt

Bash

Copy

7. 用sed命令替换文件内容

life替换为leaves

sed 's/life/leaves/' a.txt

Bash

Copy

替换一行中出现的第n个匹配内容
语法:

sed ‘s/old_pattern/new_pattern/n’ filename

Bash

Copy

例子:
替换匹配内容行的第2个匹配的内容:

[root@rhel7 ~]# sed 's/to/two/2' a.txt

Bash

Copy

我们写“2”是因为我们替换了第二个出现的内容。同样,你可以根据需要修改,比如修改为3或4等。

替换每一行中出现的所有匹配内容:

[root@rhel7 ~]# sed 's/life/learn/g' a.txt

Bash

Copy

将匹配内容从第n个开始替换为目标内容:
语法:

sed ‘s/old_pattern/new_pattern/ng’ filename

Bash

Copy

例子:
从每行第2个匹配内容开始替换

[root@rhel7 ~]# sed 's/to/TWO/2g' a.txt

Bash

Copy

这个sed命令将每一行(上面的命令带有g表示每一行)中出现的第二个、第三个等匹配的to替换为TWO

如果您希望只打印替换行,那么使用“-n”选项和“/p”打印标志来只显示替换行。

[root@rhel7 ~]# sed -n 's/to/TWO/p' a.txt

Bash

Copy

如果您希望打印替换的行两次,那么只使用“/p”打印标记而不使用“-n”选项

[root@rhel7 ~]# sed 's/to/TWO/p' a.txt

Bash

Copy

替换特定行号上的匹配内容。这里,“m”是行号。

语法:

sed ‘m s/old_pattern/new_pattern/’ filename

Bash

Copy

例如:

[root@rhel7 ~]# sed '3 s/every/each/' a.txt

Bash

Copy

如果您只想打印替换的行

[root@rhel7 ~]# sed -n '3 s/every/each/p' a.txt

Bash

Copy

在已定义的行范围内替换字符串
语法:

sed ‘x,y s/old_pattern/new_pattern/’ filename

Bash

Copy

x = 开始的行号
y = 结束的行号

例子:

[root@rhel7 ~]# sed '2,5 s/to/TWO/' a.txt

Bash

Copy

注意:如果我们希望将匹配内容操作到文件的最后一行,可以使用$来代替y

例如:

[root@rhel7 ~]# sed '2,$ s/to/TWO/' a.txt

Bash

Copy

如果您希望替换匹配的内容以忽略字符大小写(以大写或小写开头),那么有两种方法可以替换这些匹配的内容

首先,可以先/i的参数

语法:

sed ‘s/old_pattern/new_pattern/i’ filename

Bash

Copy

例如:

[root@rhel7 ~]# sed 's/life/Love/i' a.txt

Bash

Copy

第二种方法,可以使用正则表达式:

[root@rhel7 ~]# sed 's/[Ll]ife/Love/g' a.txt

Bash

Copy

将多个空格替换为单个空格

[root@rhel7 clang]# sed 's/  */ /g' filename

Bash

Copy

在指定匹配内容的行里,替换内容
语法:

sed ‘/followed_pattern/ s/old_pattern/new_pattern/’ filename

Bash

Copy

例子:

[root@rhel7 ~]# sed '/is/ s/live/love/' a.txt

Bash

Copy

替换内容,除了第N行
语法:

sed ‘n!s/old_pattern/new_pattern/’ filename

Bash

Copy

例子:

[root@rhel7 ~]# sed -i '5!s/life/love/' a.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值