目录

linux-sed命令

目录

linux sed命令

linux sed命令

作为三剑客的一员,也是到了不得不写写总结的时候了,

按惯例,

先给出出处,首当齐冲wiki

sed(意为流编辑器,源自英语“stream editor”的缩写)是一个使用简单紧凑的编程语言来解析和转换文本Unix实用程序。sed是最早支持正则表达式的工具之一,至今仍然用于文本处理,特别是用于替换命令。用于纯文本字符串操作和“流编辑”的常用工具还有AWK和Perl 。(wiki上的解释,perl都只有一个工具。。。)

sed是一个面向行的文本处理实用程序:它从输入流或文件中逐行读取文本到一个称为模式空间 的内部缓冲区。每读一行开始一个循环 。对于模式空间,sed会应用sed脚本 指定的一个或多个操作。sed实现了一种编程语言,其中包含大约25个指定文本操作的命令 。对于每个输入行,在运行脚本之后,sed通常输出模式空间(由脚本修改的行),然后从下一行再次开始循环。其他脚本结束行为可通过sed选项和脚本命令获得,例如d删除模式空间,q退出,N立即将下一行添加到模式空间,等等。因此,sed脚本对应于循环体,循环体遍历流的行,其中循环本身和循环变量(当前行号)是隐式的并由sed维护。

为输入流的每一行执行一次主循环,在输入的每一行上计算sed脚本。sed脚本的每一行都是模式-动作对,指示着要匹配的模式和要执行的操作,可以将其重新组合为条件语句。因为主循环、工作变量(模式空间和保持空间)、输入和输出流以及默认操作(复制行到模式空间、打印模式空间)是隐式的,所以可以编写简洁的单行程序。

sed用法

包括有 查找替换 、文本 插入删除

Sed 命令语法:

sed [options] ‘command’ [inputfile…]

这里:

‘选项’: 这些是可选标志,用于修改 sed 命令的行为。

‘命令’: 这定义了要在输入文件上执行的命令或命令序列。

‘输入文件’: 一个或多个要处理的输入文件。

最常用的 SED 命令选项,让我们一起来看看:

选项 描述

-i 直接编辑文件而不打印到控制台(覆盖文件)。

-n 抑制自动打印行。

-e 允许执行多个命令。

-f 从文件而不是命令行读取 sed 命令。

-r 启用扩展正则表达式。

替换

sed ‘s/unix/linux/’ geekfile.txt

这里“s”表示替换操作。“/”是分隔符。“unix”是搜索模式,“linux”是替换字符串。默认情况下,sed 命令只会替换每行中模式的第一个出现,而不会替换该行中的第二个、第三个……出现。

替换行中模式的第 n 次出现

sed ‘s/old_word/new_word/n’ filename

从第 n 次出现替换到该行的所有出现

sed ‘s/unix/linux/3g’ geekfile.txt

将每个单词的第一个字符用括号括起

echo “Welcome To The Geek Stuff” | sed ‘s/(\b[A-Z])/(\1)/g’

在特定行号替换 字符串

sed ‘3 s/unix/linux/’ geekfile.txt

该 sed 命令仅在第三行替换字符串。

使用 /p 标志复制替换后的行

/p 标志会将替换后的行打印两次到终端。如果行中没有搜索模式且未被替换,则 /p 标志只会打印该行一次。

仅打印被替换的行

使用 -n 选项与 /p 打印标志一起显示仅替换后的行。这里 -n 选项会抑制 /p 标志生成的重复行,并仅打印替换后的行一次。

sed -n ‘s/unix/linux/p’ geekfile.txt

如果你单独使用 -n 而不使用 /p,那么 sed 将不会打印任何内容。

替换指定行范围内 的字符串

sed ‘1,3 s/unix/linux/’ geekfile.txt

sed ‘2,$ s/unix/linux/’ geekfile.txt

这里的 $ 表示文件的最后一行。因此,sed 命令会替换文件从第二行到最后一行的文本。

删除

从特定文件 删除

SED 命令也可以用于从特定文件删除行。SED 命令用于在不打开文件的情况下执行删除操作。

示例:

  1. 用于删除某一行,例如第 n 行

    Syntax:

    $ sed ‘nd’ filename.txt

    Example:

    $ sed ‘5d’ filename.txt

  2. 删除最后一行

    Syntax:

    $ sed ‘$d’ filename.txt

  3. 删除从第 x 行到第 y 行的文本

    Syntax:

    $ sed ‘x,yd’ filename.txt

    Example:

    $ sed ‘3,6d’ filename.txt

  4. 删除从第 n 行到最后一行

    Syntax:

    $ sed ‘nth,$d’ filename.txt

    Example:

    $ sed ‘12,$d’ filename.txt

  5. 删除匹配的行

    Syntax:

    $ sed ‘/pattern/d’ filename.txt

    Example:

    $ sed ‘/abc/d’ filename.txt

插入

在每行后插入一个空行

sed G a.txt

插入两行空行

sed ‘G;G’ a.txt

删除空行并在每行后面插入一行空行

sed ‘/^$/d;G’ a.txt

在每行匹配“爱”字的行上方插入一行空行

sed ‘/love/{x;p;x;}’ a.txt

在每行包含“love”的下方插入一个空行

sed ‘/love/G’ a.txt

在每行的左侧插入 5 个空格

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’ filename

示例 :

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

2 – 删除最后一行

语法: sed ‘$d’ filename

3 – 从 x 到 y 范围删除行

命令: sed ‘x,yd’ filename

示例 :

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

4 – 从第 n 行删除到最后一行

语法: sed ‘nth,$d’ filename

示例:

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

5 – 匹配模式的行进行删除 –

语法: sed ‘/模式/d’ 文件名

示例:

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

6 – 从第 n 行开始删除该行及之后每隔一行的行 –

命令: sed ‘n~2d’ filename

示例 :

[root@rhel7 ]# sed ‘32d’ a.txt

7 – 删除匹配模式及其后两行的内容 –

语法: sed ‘/pattern/,+2d’ filename

示例 :

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

8 – 删除空行

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

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

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

查看 / 打印 文件

如果我们想查看文件的内容,可以使用cat命令,如果想查看文件的底部和顶部内容,可以使用head和tail工具。但如果需要查看文件中间的某个部分呢?这里我们将讨论如何使用 SED 命令来查看文件的某个部分。

1 – 从 x 到 y 范围查看文件 –

命令: sed -n ‘x,yp’ filename

示例 :

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

2 – 查看整个文件除给定范围外的所有内容 –

命令: sed ‘x,yd’ filename

示例 :

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

3 – 打印文件的第 n 行 –

命令: sed -n ‘address’p filename

示例 :

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

4 – 从第 x 行打印到第 y 行。

Syntax: sed -n ‘x,y’p filename

示例:

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

5 – 只打印最后一行 –

语法:sed -n ‘$’p filename

6 – 从第 n 行打印到文件末尾 –

Syntax: sed -n ‘n,$p’ filename

示例:

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

模式打印

7 – 只打印匹配该模式的行

命令: sed -n /pattern/p filename

示例 :

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

8 – 打印与模式匹配的行,即从输入到第 x 行。

命令: sed -n ‘/pattern/,xp’ filename

示例 :

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

以下打印匹配模式的行,第 3 行匹配模式“everyone”,因此它打印从第 3 行到第 5 行。如果想打印文件到结尾,请使用$代替 5。

9 – 从输入的第 x 行开始打印行,直到匹配到模式为止。如果未找到模式,则打印到文件末尾。

语法: sed -n ‘x,/pattern/p’ filename

示例:

sed -n ‘1,/everyone/p’ a.txt

10 – 匹配模式的行并打印到下一个 x 行 –

语法:sed -n ‘/pattern/,+xp’ filename

示例:

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’ filename

示例 :

[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/旧模式/新模式/ng’ 文件名

示例:

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

注意 – 这个 sed 命令将一行中模式“to”的第二次、第三次等出现替换为“TWO”。

如果您只想打印被替换的行,请使用“-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 ‘m s/old_pattern/new_pattern/’ filename

示例:

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

如果您只想打印被替换的行——

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

6 – 在指定范围的行上替换字符串 –

语法: sed ‘x,y s/旧模式/新模式/’ 文件名

where,

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’ filename

示例:

[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/' filename

示例:

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

10 – 除第 n 行外用其他模式替换某模式。

语法: sed 'n!s/old_pattern/new_pattern/' filename

示例:

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

内容来自下网站:

— END —