📜  Linux 中的 SED 命令 | 2套

📅  最后修改于: 2022-05-13 01:57:27.738000             🧑  作者: Mango

Linux 中的 SED 命令 | 2套

我们已经通过示例讨论了 Linux/Unix 中的 Sed 命令中的一些 SED 命令选项

SED 用于查找、过滤、文本替换、替换和文本操作,如插入、删除搜索等。它是 Linux/Unix 系统提供的强大实用程序之一。我们可以将 sed 与正则表达式一起使用。我希望你至少对 Linux 正则表达式有基本的了解。

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

sed 一般语法
sed 选项... [脚本] [输入文件...]

首先创建一个.txt文件,我将在该文件上执行 SED 命令的操作。在这篇博客中,我使用了“a.txt”文件来解释所有的例子。如果我写下每个 sed 命令的输出,博客将变得太长。因此,您最初可以参考同一个文件来练习所有命令。



[root@rhel7 ~]# cat a.txt
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.

# 让我们从文件间距开始
1 –在每一行后插入一个空行 –

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

sed 输出

2 –插入两个空行 –

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

3 –删除空行并在每行后插入一个空行 –

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

4 –在与“love”匹配的每一行上方插入一条黑线 –

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

5 –在与“love”匹配的每一行下方插入一个空行 –

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

6 –在每行左侧插入 5 个空格 –



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

# 编号行
1 –为文件的每一行编号(左对齐)。 **=** 用于对行进行编号。 \t 用于数字和句子之间的制表符 –

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

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

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

3 –对文件的每一行进行编号,仅当行不为空时 –

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

# 删除行
1 –删除特定行 –
语法:sed 'nd' 文件名
例子 :

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

2 –删除最后一行
语法:sed '$d' 文件名

3 –从范围 x 到 y 删除行
语法:sed 'x,yd' 文件名
例子 :

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

4 –从第 n 行到最后一行删除
语法:sed 'nth,$d' 文件名
例子 :

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

5 –删除patter匹配行 –
语法:sed '/pattern/d' 文件名
例子 :

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

6 –删除从第 n 行开始的行和从那里开始的每 2 行 –
语法:sed 'n~2d' 文件名
例子 :

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

7 –删除与模式匹配的行和之后的 2 行 –
语法:sed '/pattern/,+2d' 文件名
例子 :



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

8 –删除空行

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

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

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

# 查看/打印文件
如果我们想查看文件的内容,那么我们使用cat命令,如果我们想查看任何文件的底部和顶部的内容,我们使用headtail等工具但是如果我们需要查看任何文件中间的特定部分怎么办?在这里我们将讨论如何使用 SED 命令查看任何文件的某个部分。
1 –从 x 到 y 范围查看文件 –
语法:sed -n 'x,yp' 文件名
例子 :

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

2 –查看除给定范围之外的整个文件 –
语法:sed 'x,yd' 文件名
例子 :

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

3 –打印文件的第 n 行 –
语法:sed -n 'address'p 文件名
例子 :

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

4 –打印从第 x 行到第 y 行的行。
语法:sed -n 'x,y'p 文件名
例子 :

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

5 –只打印最后一行 –
语法:sed -n '$'p 文件名

6 –从第 n 行打印到文件末尾 –
语法:sed -n 'n,$p' 文件名
例子 :

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

图案印刷
7 –仅打印与模式匹配的行 –
语法:sed -n /pattern/p 文件名
例子 :

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

8 –打印与模式匹配的行,即从输入到第 x 行。
语法:sed -n '/pattern/,xp' 文件名
例子 :



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

下面打印匹配模式的行,第三行匹配模式“everyone”,所以从第三行打印到第五行。如果要打印文件直到结束,请使用$代替 5。

9 –从输入的第 x 行开始打印行,直到与模式匹配的行。如果未找到该模式,则它会打印到文件末尾。
语法:sed -n 'x,/pattern/p' 文件名
例子 :

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

10 –打印与模式匹配的行,直到下一个 xth 行 –
语法:sed -n '/pattern/,+xp' 文件名
例子 :

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

# 替换为 sed 命令
1 –更改模式的第一次出现 –

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

2 –替换一行中第 n 次出现的模式 –
语法:sed 's/old_pattern/new_pattern/n' 文件名
例子 :

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

我们写“2”是因为我们替换了第二次出现。同样,您可以根据需要使用 3、4 等。

3 –替换一行中所有出现的模式。

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

4 –将模式从第 n 个出现替换为一行中的所有出现。
语法:sed 's/old_pattern/new_pattern/ng' 文件名
例子 :

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

注意 –此 sed 命令在一行中用“TWO”替换模式“to”的第二次、第三次等出现。

如果你只想打印替换的行,那么使用“-n”选项和“/p”打印标志来只显示替换的行——



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

如果你想打印两次替换的行,那么只使用“/p”打印标志而不使用“-n”选项-

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

5 –替换特定行号上的模式。这里,“m”是行号。
语法:sed 'ms/old_pattern/new_pattern/' 文件名
例子 :

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

如果您只想打印替换的行 –

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

6 –在定义的行范围内替换字符串–
语法:sed 'x,ys/old_pattern/new_pattern/' 文件名
在哪里,
x = 起始行号
y = 结束行号

例子 :

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

注意 –如果我们希望将模式更改为文件中的最后一行,则可以使用$代替“y”。
例子 :

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

7 –如果您希望替换模式以忽略字符大小写(以大写或小写开头),那么有两种方法可以替换此类模式 –
首先,通过使用“/i”打印标志 -
语法:sed 's/old_pattern/new_pattern/i' 文件名
例子 :

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

其次,通过使用正则表达式——

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

8 –用一个空格替换多个空格 –

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

9 –替换一个模式,然后是另一个模式 –
语法:sed '/followed_pattern/s/old_pattern/new_pattern/' 文件名
例子 :

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

10 –用除第 n 行以外的其他模式替换一个模式。
语法:sed 'n!s/old_pattern/new_pattern/' 文件名
例子 :

[root@rhel7 ~]# sed -i '5!s/life/love/' a.txt