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命令,如果我们想查看任何文件的底部和顶部内容,我们使用head
和tail
等工具。但是,如果我们需要查看文件中间的特定部分,该怎么办呢?在这里,我们将讨论如何使用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