我们在《SED命令及示例》中讨论了一些SED命令选项。
SED用于查找、过滤、文本替换、替换以及文本操作,如插入、删除、搜索等。它是Linux/Unix系统提供的一款强大工具。我们可以将SED与正则表达式一起使用。希望你至少具备Linux正则表达式的基本知识。
它提供非交互式文本文件编辑,因此用于自动化编辑,并且有两个缓冲区——模式缓冲区和保持缓冲区。SED_在读取文件时使用_模式缓冲区,逐行读取,当前读取的行被插入到模式缓冲区,而_保持缓冲区_是长期存储,它捕获信息、存储信息,并在需要时重新使用。最初,这两个缓冲区都是空的。SED命令用于在不打开文件的情况下执行不同操作。
SED通用语法:
SED 选项……\[脚本\]\[输入文件……\]
首先创建a.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
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’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‘/pattern/d’filename
示例:
[root@rhel7 ~]# sed '/life/d' a.txt
6–从第n行开始,每隔2行删除一行–
语法:sed‘n2d’filename
示例:
[root@rhel7 ~]# sed '3~2d' a.txt
7–删除匹配模式的行以及之后的2行–
语法: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行的行。
语法:sed-n‘x,y’p filename
示例:
[root@rhel7 ~]# sed -n '4,6'p a.txt
5–仅打印最后一行–
语法:sed-n‘’p filename
6–从第n行打印到文件末尾–
语法: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/old_pattern/new_pattern/ng’filename
示例:
[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/old_pattern/new_pattern/’filename
其中,
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