sed常用语法
sed是什么?
是一种用于文本处理的流式编辑器,常用于替换、删除、插入、打印等操作。
sed语句只显示处理之后的结果,但是文本本身是没有被处理的,除加特殊用法:
特殊用法:
sed -r:sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法《正则表达式》)
-i:直接修改读取的文件内容,而不是输出到终端。
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
sed的基本语法如下:
sed [options] [script] [input_file]
options:用于指定sed的选项,如-i用于直接修改原始文件、-n用于禁止默认输出等。
script:包含一系列sed命令的脚本,用于定义文本处理规则,可以是一个或多个命令组成。
input_file:要处理的输入文件。
command命令(简单用法)
a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
y:大小写转换,和s用法类似,但只能替换大小写
n:读取下一个输入行, 用下一个命令处理新的行
&:经常用来在原文本行中增加字符串。
常用用法:
-
替换文本:使用s命令可以替换文件中的文本。
例如,将文件中的所有"old"替换为"new"可以使用命令
s/old/new/:将第一个匹配到的"old"替换为"new"。 s/old/new/g:将所有匹配到的"old"替换为"new"。 //此处可替换:g表示全局替换、i表示忽略大小写 实例:将文件中的"foo"替换为"bar":`sed 's/foo/bar/' file.txt
-
行首和行尾操作:
^:匹配行首。
$:匹配行尾。
实例:将文件中以"foo"开头的行删除:sed '/^foo/d' file.txt
-
删除行:使用d命令可以删除文件中的行。
例如,删除包含特定文本的行可以使用命令
语法:sed ‘/pattern/d’ file [root@localhost ~]# cat a //删除第一行 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '1d' a 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 实例:删除文件中包含"foo"的行: sed '/foo/d' file.txt [root@localhost ~]# cat a //删除以1开头的所有行 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '/1/d' a 0.0.0.0 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0
//表示删除所有空行 [root@localhost ~]# sed '/^$/d' ab //删除以jw开头的行 [root@localhost ~]# cat ab on the UNIX Operating System. first:second one:tow jwnjhdbhgqa [root@localhost ~]# sed '/^jw/d' ab on the UNIX Operating System. first:second one:tow
-
插入行:使用i命令可以在文件中插入新的行。
例如,将新行插入到指定行号的下方可以使用命令
语法:sed ‘5i new line’ file i\text:在匹配到的行之前插入文本 [root@localhost ~]# cat a 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '1i\ hello' a //"\"表示让空格生效 hello 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //在具体的某一行前面插入 [root@localhost ~]# sed '/10.10.10.128/i\ hello' a 0.0.0.0 hello 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13
-
追加文本
a\text:在匹配到的行之后追加文本。 [root@localhost ~]# cat a 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '1ahello world' a //在第一行后面加hello world 0.0.0.0 hello world 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //如果想让空格在查询到文本中显示 [root@localhost ~]# cat a 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '1a\ hello' a //加\可以显示出来 0.0.0.0 hello 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //在指定某一行的后面插入 [root@localhost ~]# sed '/10.10.10.128/a\ hello' a 0.0.0.0 10.10.10.128 hello 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //具体的匹配某一数字 [root@localhost ~]# sed '/255/a\ hahaha' a 0.0.0.0 10.10.10.128 255.255.255.255 hahaha 255.255.255.0 hahaha 255.255.0.0 hahaha 255.0.0.0 hahaha 1111.1111.1111.1111.1 1e13 //在每个以255开头的字段后面加 //每一行后面都加 [root@localhost ~]# sed -r 'a\ hahaha' a 0.0.0.0 hahaha 10.10.10.128 hahaha 255.255.255.255 hahaha 255.255.255.0 hahaha 255.255.0.0 hahaha 255.0.0.0 hahaha 1111.1111.1111.1111.1 hahaha 1e13 hahaha [root@localhost ~]# sed -r '/(255.)?/a\ hahaha' a 0.0.0.0 hahaha 10.10.10.128 hahaha 255.255.255.255 hahaha 255.255.255.0 //此处的(255.)?表示匹配到括号内的也可以匹配其他的任何东西 hahaha 255.255.0.0 hahaha 255.0.0.0 hahaha 1111.1111.1111.1111.1 hahaha 1e13 hahaha
-
更改
c:将一整行都替换掉 //将第二行替换成hello [root@localhost ~]# cat a 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '2chello' a 0.0.0.0 hello 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //将2-4行替换成为hahaha [root@localhost ~]# cat a 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 [root@localhost ~]# sed '2,4chahaha' a 0.0.0.0 hahaha 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //将2-4行替换成为成两行 [root@localhost ~]# sed '2,4cha\nhaha' a //\n表示换行 0.0.0.0 ha haha 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 1e13 //更改最后一行 [root@localhost ~]# sed '$chahaha' a //$表示最后一行 0.0.0.0 10.10.10.128 255.255.255.255 255.255.255.0 255.255.0.0 255.0.0.0 1111.1111.1111.1111.1 hahaha
-
s:表示替换
//&:用正则表达式的内容进行替换 [root@localhost ~]# echo "hello huayu" | sed -r 's/hello (.*)/hehe &/g' hehe hello huayu //此处的&表示hello huayu
//此处的空格为tab键 [root@localhost ~]# cat a 0.0.0.0 10. 10.10 .128 255.255.255.255 255.255.255.0 255.0.0.0 [root@localhost ~]# sed 's/\t/\ > /2' a //\t表示tab键 \表示换行 表示第二个tab键替换成换行 0.0.0.0 10. 10.10 .128 255.255.255.255 255.255.255.0 255.0.0.0 //把10替换成换行 [root@localhost ~]# sed 's/10/\ /' a 0.0.0.0 . 10.10 .128 255.255.255.255 255.255.255.0 255.0.0.0 //在10后面换行 [root@localhost ~]# sed 's/10/10\ //可以将\换成\n同样表示换行 /' a windows:换行\r\n 0.0.0.0 10 . 10.10 .128 255.255.255.255 255.255.255.0 255.0.0.0
[root@localhost ~]# cat jj .Ah "Major Heading" [root@localhost ~]# sed '/.Ah/s/.Ah/@A HEAD =/' jj @A HEAD = "Major Heading" [root@localhost ~]# sed '/.Ah/s/.Ah/@A HEAD =/;s/"//g' jj @A HEAD = Major Heading //;表示结束 g:表示所有
\s表示匹配任意空白字符,包括空格、tab键、回车符、换行符等等
[root@localhost ~]# sed 's/UNIX/\\s-2&\\s0/' ab on the \s-2UNIX\s0 Operating System. //&在此处代替UNIX
颠倒:
[root@localhost ~]# cat ab on the UNIX Operating System. first:second one:tow [root@localhost ~]# sed -r 's/(.*):(.*)/\2:\1/g' ab on the UNIX Operating System. second:first tow:one
-
转换:(大小写转换)
语法:y/abcdefghijklmnopqrstuvwsyz/ABCDEFGHIJKLMNOPQRSTUVWSWZ [root@localhost ~]# cat ab on the UNIX Operating System. first:second one:tow jwnjhdbhgqa [root@localhost ~]# sed 'y/abcdefghijklmnopqrstuvwsyz/ABCDEFGHIGKLMNOPQRSTUVWSYZ/' ab //将小写换成大写 ON THE UNIX OPERATING SYSTEM. FIRST:SECOND ONE:TOW GWNGHDBHGQA
-
打印(正常的系统自带打印功能)
p:表示打印 [root@localhost ~]# cat ab on the UNIX Operating System. first:second one:tow jwnjhdbhgqa [root@localhost ~]# sed -n '/one/p' ab //关闭默认答应功能 匹配这一行并打印 one:tow
-
打印特定行:使用p命令可以打印文件中的特定行。
例如,打印包含特定文本的行可以使用命令
语法:sed -n ‘/pattern/p’ file //-n关闭默认打印功能 [root@localhost ~]# cat ab on the UNIX Operating System. first:second one:tow jwnjhdbhgqa [root@localhost ~]# sed -n '/one/p' ab //关闭默认答应功能 匹配这一行并打印 one:tow
-
批量编辑文件:使用-f选项可以将一系列sed命令保存在脚本文件中,并对多个文件进行批量编辑。
例如,使用sed脚本文件对多个文件进行替换可以使用命令
语法:sed -f scriptfile file1 file2 …
-
忽略大小写:
i:在替换命令中,忽略大小写。 实例:将文件中所有的"foo"替换为"bar",忽略大小写: sed 's/foo/bar/gi' file.txt
-
执行多个命令:
-e:执行多个sed命令。 实例:将文件中的"foo"替换为"bar",并删除以"test"开头的行: `sed -e 's/foo/bar/g' -e '/^test/d' file.txt`
-
保存修改结果:
-i`:直接在原文件上进行修改(仅适用于GNU sed)。 实例:将文件中的"foo"替换为"bar",并保存修改结果:sed -i 's/foo/bar/g' file.txt
-
多行删除
d删除:(删除偶数行) D(会进行多次处理,将多个空行变成一个空行) 删除指定行范围:sed '2,4d' file.txt 这将删除文件file.txt中的第2至第4行。 删除匹配模式的行:sed '/pattern/d' file.txt 这将删除文件file.txt中包含模式"pattern"的所有行。 删除空行:sed '/^$/d' file.txt 这将删除文件file.txt中的所有空行。 删除连续的重复行:sed '$!N; /^\(.*\)\n\1$/!P; D' file.txt
-
多行打印
P(打印匹配到的一行) 打印两行文本:sed -n 'N; p' file.txt 这将读取文件file.txt的内容,并打印每两行。 打印特定行范围内的文本:sed -n '3,6p' file.txt 这将打印文件file.txt中第3行到第6行的内容。 打印匹配特定模式的多行文本:sed -n '/pattern/,/pattern/p' file.txt 这将打印文件file.txt中包含匹配模式的文本块。 打印指定行号的文本:sed -n '5p' file.txt 这将打印文件file.txt中的第5行。 打印最后几行的文本:sed -n '$-2,$p' file.txt
保持空间和模式空间
当使用sed命令时,sed会将输入文件一行一行地读取到模式空间中,然后根据所提供的命令对模式空间中的内容进行处理。而保持空间是sed提供的一个临时存储区域,用于存储模式空间中的内容,以便在处理后的某些情况下进行访问和操作。
模式空间:是sed命令默认使用的缓冲区,它存储着当前读取的文本行。当sed命令读取一行文本时,该行文本会被存储到模式空间中,并且可以对模式空间中的文本进行操作,如打印、替换等。模式空间的内容可以通过命令进行修改,也可以通过命令打印出来或输出到标准输出。
保持空间:是一个额外的缓冲区,用于存储之前读取的文本行。通过一些特定的命令,可以将模式空间中的内容复制到保持空间中,或者将保持空间中的内容追加到模式空间中。保持空间的内容可以在后续的操作中使用,以实现一些需要多行数据处理的功能。
- 保持空间的读取和写入:
- 读取保持空间内容到模式空间:
h
命令 - 将模式空间内容写入保持空间:
H
命令
- 读取保持空间内容到模式空间:
- 保持空间和模式空间的交换:
- 将模式空间内容复制到保持空间,并清空模式空间:
x
命令 - 将保持空间内容复制到模式空间,并清空保持空间:
g
命令
- 将模式空间内容复制到保持空间,并清空模式空间:
- 模式空间和保持空间的追加和附加:
- 追加保持空间内容到模式空间:
G
命令 - 附加模式空间内容到保持空间:
a
命令和i
命令
- 追加保持空间内容到模式空间:
^$:表示空行 !:表否定 H:将模式空间(教室)的东西放到保持空间(仓库) G:追加保持空间内容到模式空间 x:将保持空间里面的东西与模式空间对调
- 保持空间的读取和写入:
-
分支
在sed中,分支使用以下语法: [address]b [label] [address]t [label] [address]是一个可选的地址范围,用于指定应用分支的行。 b命令用于无条件分支 t命令用于条件分支 [label]是一个标签,用于指定分支的目标位置。 无条件分支(b命令):会导致sed跳转到指定的标签处,并继续执行后续的命令。例如: sed '2b label' file.txt 上面的命令会从文件file.txt的第二行开始处理,当遇到b命令时,会跳转到标签label处。 条件分支(t命令):会根据指定的条件进行判断,如果条件为真,则跳转到指定的标签处。例如: sed '/pattern/t label' file.txt 上面的命令会在文件file.txt中查找匹配pattern的行,如果找到,则跳转到标签label处。
grep
取掩码:
[root@localhost ~]# cat a
0.0.0.0
10.10.10.128
255.255.255.255
255.255.255.0
255.255.0.0
255.0.0.0
1111.1111.1111.1111.1
1e13
[root@localhost ~]# grep -E '^([0-2][0-5]?[0-5]?\.){3}[0-2][0-5]?[0-5]?$' a
0.0.0.0
255.255.255.255
255.255.255.0
255.255.0.0
255.0.0.0
进阶版:
[root@localhost ~]# grep -E '^([0-2]([0-5]?){2}\.){3}[0-2]([0-5]?){2}$' a
{2}表示对(0-5)?的重复两次 ?表示0次或者1次