linux sed命令
作为三剑客的一员,也是到了不得不写写总结的时候了,
按惯例,
先给出出处,首当齐冲wiki
https://zh.wikipedia.org/wiki/Sed
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 命令用于在不打开文件的情况下执行删除操作。
示例:
-
用于删除某一行,例如第 n 行
Syntax:
$ sed ‘nd’ filename.txt
Example:
$ sed ‘5d’ filename.txt -
删除最后一行
Syntax:
$ sed ‘$d’ filename.txt -
删除从第 x 行到第 y 行的文本
Syntax:
$ sed ‘x,yd’ filename.txt
Example:
$ sed ‘3,6d’ filename.txt -
删除从第 n 行到最后一行
Syntax:
$ sed ‘nth,$d’ filename.txt
Example:
$ sed ‘12,$d’ filename.txt -
删除匹配的行
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 ‘3~2d’ 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
内容来自下网站:
https://www.geeksforgeeks.org/sed-command-linux-set-2/
— END —