Linux系统三剑客之grep和正则表达式的介绍(一)-CSDN博客
目录
8.3 以下主要针对各命令的练习,如s,i,a,r,w,p等
接上文
sed命令是一个非交互式的行文本编辑器,它能对文件内容进行编辑,默认每次处理文本文件中所匹配到一行内容到模式空间,然后用后面的命令进行操作,操作完成之后,会把模式空间里面的内容输出到屏幕上,然后把模式空间中的内容删除,同时把下一行所匹配到的内容读入模式空间内,依次循环,直到读取完整个文件。
sed 命令处理的是缓冲区中的内容,其实这里的缓冲区,就是模式空间
sed语法支持两种格式,分别是
sed [options] 'address command' file
sed [options] -f [scripefile] file
对以上的几个英语字符进行说明:
options为选项,其中sed支持的选项会在下面的选项小结说明
address : 相当于匹配的条件,会在地址中进行说明
command为命令,相当于一个参数,放在地址后面,具体见下面的命令小节说明
file :为文本文件
需要说明的是,使用时address和command会挨在一起,中间没有空格,上面语法中间加空格是为了说明这是两个部分
以下为sed命令的工作流程图
这里的选项就是指sed之后的options,常见的选项具体如下:
-e ,--expression=script
以选项中指定的script参数来处理文本文件,可以指定多个命令
-f file,--files=script
以文件中的指定的参数来处理文本文件
-n ,--quiet ,--slient
取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-r ,--regexp-extended
支持扩展正则表达式
-i,--in-place[=SUFFIX]
直接修改文件内容
这里的地址就是语法格式中的address部分,是在单引号里的前一部分 。
替换标记 | 说明 |
---|---|
linenumber | 指定特定行号 |
startline,endline | 指定起始行号和结束行号 |
linenumber,+n | n为数字,表示从指定行号向后n行 |
/pattern/ | 已正则表达式表示的匹配模式 |
/pattern1, /pattern2/ | 从模式匹配1到模式匹配2 |
pattern/,x | 在给定行号上查询包含模式的行 |
x,/pattern/ | 通过行号和模式查询匹配的行 |
x,y! | 查询不包含指定行号x和y的行 |
这里的指令就是command,这个一般放在单引号内,同时和要处理的字符放在一起,只是command放在字符的前面。
a 追加,向匹配行后面插入内容
i 插入,向匹配行前插入内容
c 更改,更改匹配行的内容
d 删除,删除匹配行的内容
s 使用替换模式替换相应模式
s/patten/newstring 替换,把patten匹配到的内容换成newstring
p 打印,打印出匹配的内容,通过与-n选项配合使用
= 标号,用来将匹配的行前标号
n 读取下一行,遇到n会自动自动跳入下一行
r 将内容读入文件
{} 命令间的传递,类似于管道符|
w 将匹配内容写入文件
W 将匹配到行的第一行,保存到file中。
g : 表示将匹配到的内容进行全局替换 。
\1 :表示前面第一个左括号所表示的内容 ,\2表示前面第二个左括号中表示的内容,依次类推
& : 表示前面匹配到的内容
正在匹配在上面已经介绍到,详情请见正则表达式介绍。这里只是说明在sed命令中也会用到。
先准备数据文件aa.txt,通过cat查看aa.txt文件内容
[root@localhost test]# cat aa.txt
总用量 28
lrwxrwxrwx. 1 root root 7 9月 10 06:12 bin -> usr/bin
dr-xr-xr-x. 6 root root 4096 9月 10 06:44 boot
drwxr-xr-x. 20 root root 3360 9月 29 05:19 dev
drwxr-xr-x. 3 root root 20 9月 14 03:08 docker_registry
drwxr-xr-x. 2 root root 41 9月 17 06:23 docker_study
drwxr-xr-x. 151 root root 12288 9月 29 05:20 etc
drwxr-xr-x. 3 root root 18 9月 10 06:57 home
lrwxrwxrwx. 1 root root 7 9月 10 06:12 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 9月 10 06:12 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 4月 11 2018 media
drwxr-xr-x. 2 root root 21 9月 19 21:51 mnt
drwxr-xr-x. 4 root root 34 9月 11 06:53 opt
dr-xr-xr-x. 307 root root 0 9月 29 05:19 proc
dr-xr-x---. 7 root root 266 9月 29 05:20 root
drwxr-xr-x. 45 root root 1320 9月 29 06:26 run
lrwxrwxrwx. 1 root root 8 9月 10 06:12 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 4月 11 2018 srv
dr-xr-xr-x. 13 root root 0 9月 29 05:19 sys
drwxr-xr-x. 3 root root 43 9月 26 19:11 test
drwxrwxrwt. 24 root root 4096 9月 29 06:38 tmp
drwxr-xr-x. 13 root root 155 9月 10 06:12 usr
drwxr-xr-x. 22 root root 4096 9月 10 06:45 var
1.显示文件中的第2行内容
2.删除文件中3~13行 ?
3.删除匹配boot的行 ?
4.删除以d开头的行 ?
5.?删除包含d字符的行 ?
6.打印匹配以d开头到以l开头的行(多次匹配) ?
7.打印dev到第5行,其中不包含第5行 ?
8.打印第2行到匹配到dev之间的行 ?
9.除3~16行之间的数据,将其它数据输出 ?
先准备数据文件,通过cat命令查看java.conf文件
[root@localhost test]#
[root@localhost test]# cat java.conf
# System-wide Java configuration file -*- sh -*-
# Location of jar files on the system
JAVA_LIBDIR=/usr/share/java
# Location of arch-specific jar files on the system
JNI_LIBDIR=/usr/lib/java
# Root of all JVM installations
JVM_ROOT=/usr/lib/jvm
# You can define a system-wide JVM root here if you're not using the
# default one.
#
# If you have a base JRE package installed
# (e.g. java-1.6.0-openjdk):
#JAVA_HOME=$JVM_ROOT/jre
#
# If you have a devel JDK package installed
# (e.g. java-1.6.0-openjdk-devel):
#JAVA_HOME=$JVM_ROOT/java
# Options to pass to the java interpreter
#JAVACMD_OPTS=
# You can disable ABRT Java Connector by setting JAVA_ABRT to "off".
# See: https://github.com/jfilak/abrt-java-connector/
#JAVA_ABRT=off
[root@localhost test]#
?1.过滤掉注释的行,备注:注释的行是以#开头
2.过滤掉所有的空行 ?
3.过滤掉所有注释行和空行,此命令用到{},不清楚的可参考上面的命令 ?
4.删除掉所有注释行和空行,(这里的删除并非对源文件内容进行删除) ?删除掉所有注释行和空行,(这里的删除并非对源文件内容进行删除)
5.匹配任何包含JVM的行 ?
6.匹配包含JNI_LIBDIR
或者JVM_ROOT
的行 ?
7.匹配任何包含数字的行 ?
将含有aaa字符的第一个字符a 替换成b.
? 2.将含有aaa的字符替换成bbb.
3.将JAVA_HOME替换成JAVA_DIR,注意,此文件包含多行JAVA_HOME ?
4.替换第二行内容中的root为test,注意是第一个匹配到的root字符。 ?
5.替换第二,三行中的root为test,这次为全局替换 ?
6.替换第二行到最后一行的root为test(全局替换) ?
7.在匹配See字符的行,行首添加hello ?
8.在匹配See字符的行,在See字符后添加hello ?
9.在匹配See字符的行,在See字符前添加hello ?
10.在匹配See字符的行,在行尾添加hello ?
11.在每一行的开头添加hello 。 ?
12.在每一行的结尾添加hello 。 ?
13.在前三行的行首添加hello 。 ?
14.在匹配ddd字符的行的前面一行添加hello ?
15.在匹配ddd字符的行的后面一行添加hello ?
16.在匹配的ddd行的下一行添加多行内容。 ?
17.将一个新行添加到文件的第三行。 ?
18.查询boot的行是在第几行 ?
以上所有的替换或变化都不会改变原文件的内容 。 ?
19.将文件info中的ccc修改为xyz。 ?
20.将文件info中匹配到tmp的行,其中包含root的字符修改为test . ?
21.在匹配kkk的行的结尾添加end字符 。 ?
22.直接替换文件中第三行的内容。 ?
23.将指定文件abc.txt中的内容插入到info文件的第三行 ?
24.将文件aa.txt中的前两行输出到文本文件abc.txt。 ?
25.?将aa.txt中匹配boot的行写入到a1.txt中 ?
26.读取文件a.sh中的指令进行替换xxx为hello world . ?