linux shell 编辑文件内容,Shell编辑与文本处理(Bash sed文本编辑)

释放双眼,带上耳机,听听看~!

1 sed 命令格式

sed 的全称是 stream editor,也就是流编辑器。其作用便是将文本文件或来自于管道符传入的输入流做文本的处理,如替换、增加内容、删除内容等等。

sed 命令基本格式:

sed [参数]… [执行命令] [输入文件]…

常用的参数:

5d857f613aaac26a494db8cd6a112ac2.png

执行命令的格式:

[n1][,n2]command

[n1][~step]command

其中 n1,n2 表示输入内容的行号,它们之间为 ,,如果为~波浪号则表示从 n1 开始以 step 为步进的所有行;command为执行动作,下面为一些常用动作指令:

411b3f52281b2e584b73b5122b83c108.png

2 sed 使用实例

1. 删除字符串

这里仍然使用上一节写的 txt 测试文档来演示,内容如下,可以使用实验桌面右边工具栏的剪切板拷贝到实验环境中:

$ vim blankspace.txt

136b27750635ffa93171b7a2c22fd4cc.png

为了让效果明显地看到,我们使用 nl 命令将 blankspace.txt 的内容与打印行号同时打印出来,同时利用 sed 将 2-5 行删除显示:

$ nl blankspace.txt | sed ‘2,5d’

fe869dd1be96405c5dffb59757780b06.png命令解释:’2,5d’ 表示 2~5 行,d 表示删除。

删除第13行到最后一行, $ 定位到最后一行:

$ nl blankspace.txt | sed ’13,$d’

6b8abe8d19977d6ae77c93a9d7b0e736.png

当然之前的操作都没有加 -i 参数,所以只是展示了效果但是没有修改原文,若是要在原文件中删除第 15 行:

$ sed -i ’15d’ blankspace.txt

59d6c9cc5823254169371e229ea5dc39.png

2. 添加字符串

在第二行后添加 test 字符串,a表示在行后添加一行加上字符串,i 表示在行前加一行添加字符串

例如:

$ nl blankspace.txt | sed ‘2a test’

9f3719790302757548496a4086c72170.png

在第二行前添加一行插入 test 字符串:

$ nl blankspace.txt | sed ‘2i test’

d3fa8f1a57694cf4cb50b423d6c8876b.png

3. 替换字符串

将 2-5 行内容取代为 blankspace

c 为替换内容选项。

$ nl blankspace.txt | sed ‘2,5c blankspace’

c6f4e48ce74687742c94de6414498d59.png

4. 列出匹配字符

列出 blankspace.txt 内第 5-7 行

sed 命令中 -n 为安静模式选项。以下两条命令执行结束后可对比结果。 $ nl blankspace.txt |sed -n ‘5,7p’

$ nl blankspace.txt |sed ‘5,7p’

3ae7c89f59da2dd147ebd8cfb8d24bd6.png

3 多重命令

如果我们需要同时执行多个操作,就要利用 sed 的多重命令特性了。

顾名思义,多重命令就是多个命令,它有如下几种使用方式。

我们先来新建一个实验文本 words,在里面输入如下内容,可以使用实验操作界面右边的工具栏中的剪切板将下面的文本内容贴入到实验环境中

$ vi words

syl

I hate wanneng

3.1 使用分号分隔命令

我们想把文本的 syl 修改成 wanneng,同时把 hate 修改成 love ,可以使用分号分隔命令:

4cea6c5d10e0870de8f1fea5df7bbd76.png如上所示,我们使用分号对命令进行了分隔。

3.2 使用 -e 参数

在 sed 命令中,还可以使用 -e 参数来执行多个命令:

$ sed -e ‘s/syl/wanneng/’ -e ‘s/hate/love/’ words

307a61635fa8b663c1577207a9cd7d63.png如上所示,多次使用 -e 参数我们可以引用多个执行命令,从而达到我们的目的

3.3. 分行

除了使用分号,以及 -e 参数之外,还可以通过分行来编写多个命令,达到多重命令的效果,如下所示:

$ sed ‘ #按enter键

quote> s/syl/wanneng/

quote> s/hate/love/’ words

e7520ebfc374caf8a0842b809c78e936.png

4. 脚本文件

在命令行输入较长的命令是不切实际的,我们可以通过在脚本文件中写入多个 sed 命令。最后再使用 sed 的 -f 参数去执行脚本文件中的命令,对目标文件进行处理。这其实也属于多重命令的一种应用方式。

4.1 语法

$ sed -f

scriptfile :脚本文件的名称。

file :待处理文件的名称。

4.2 应用

与在 多重命令 中的示例类似,可以通过编写脚本文件来达到同样的效果。

如下所示的 sed-script 脚本文件中的内容:

s/syl/wanneng/

s/hate/love/

使用 sed 命令的 -f 参数执行,结果如下。

sed -f sed-script words

6156aa9280936ed6d57435a3d4f4f965.png

除此之外,还可以像写 bash 脚本的格式去书写 sed 脚本,这时不需要使用 sed 命令,直接赋予脚本权限,执行脚本即可。

例如如下所示的 replace.sed 脚本文件的内容:

#!/bin/sed -f

s/syl/wanneng/

s/hate/love/

然后通过 chmod 命令为其添加权限后,运行结果如下图所示:

5dfdbe83b4a6b3d8297a172b241421f1.png

5. 寻址

sed 修改文件,有时候我们并不会对全文的内容进行操作,只对符合条件的行或者内容进行操作,这时候我们就会用到寻址了。而这里所谓的条件有两种:

指定的某一行

利用正则表达式,符合规则的内容

5.1 使用寻址

对于修改文件的内容,可以只对符合条件的行或者内容进行操作,也可以针对全文,大致的分类如下:

没有指定地址:应用于每一行

只有一个地址:应用于这个地址匹配的任意行

由逗号分隔的两个地址:应用于两个匹配地址之间的所有行

地址后跟感叹号:应用于不匹配该地址的所有的行

我们将在以下应用实例中逐一展示:

新建文件 xunzhi ,输入如下内容:

9d34ffe5110362450adc30a14bc66496.png

把文件中的 b 字符替换成 new,使用如下操作:

$ nl xunzhi | sed ‘s/b/new/’

在下面的运行截图中可以看到所有的 b 都被替换成 new,这就是没有指定地址的方式。 如果我们想要将字符 a 所在行的字符 b 替换为 new,就需要使用寻址:

$ nl xunzhi | sed ‘/a/s/b/new/’

7536ce1e6ec352ee709b9da3c58950f8.png

若是我们想删除最后一行,可执行如下操作:

$ nl xunzhi | sed ‘$d’

注意:d 是 sed 中的删除命令

利用正则表达式删除空行:

$ cat xunzhi | sed ‘/^$/d’

指定某个范围内的行,例如删除从第3行到最后一行的所有行:

$ nl xunzhi | sed ‘3,$d’

当然指定区间范围时,具体行数于正则也可以混合使用,例如删除第一行直到第一个空行的所有行:

$ cat xunzhi | sed ‘1,/^$/d’

d836a16cb0761fa2b40646bb7f029c86.png

5.2 分组命令

在上面的操作中,我们只是对字符 a 所在的行执行一个操作,当我们想对 a 所在的行执行多个操作的时候就需要使用到分组命令。

sed 使用大括号 {} 将一个地址嵌套在另一个地址中,或者在相同的地址上应用多个命令。我们可以根据如下实践来更好的理解。

修改我们的 xunzhi 文件内容,如下所示:

a b hello world

b world

c b d hello world

d b world good

e hello

f

我们要把包含字符 b 又包含 hello 的行中的 world 改成 shiyanlou,再把第 5 行的 world 替换成 louplus。该怎么做呢?

我们发现第 5 行包含 b 和 d。我们把 b 作为一个共同的地址。找到有 b 的行,在有 b 的行中找到有 hello 的行,然后替换 world 为 shiyanlou,再在有 b 的行中找到有 d 的行,然后替换包含 world 的为 louplus。注意这个顺序,这里有两行都同时包含 b, d, world 三个字符串,如果先去替换成 louplus 的话,那么第三行的 world 也会被替换成 louplus,而后执行替换成 shiyanlou 的时候,第三行就没有 world 那个字符串了。

新建一个文件 fenzu,输入如下内容

# this is fenzu

/b/{

/hello/s/world/waneneng/

/d /s/world/louplus/

}

文件中的注释可以使用 # 开头,这里第一行就是注释。可以不写。 注意大括号后面不能有空格,并且右括号要单独在一行。 注意 d 后面有空格,如果没有空格的话,所有含有 b 字符的行的字符 world 都会被替换成 louplus。因为 sed 会把 d 认成一个特殊字符。采用转义符去转义 d 是不行的。

运行命令:$ sed -f fenzu xunzhi

b218c643e14dba1fc36c5bc3743d5dea.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前言 10 场景说明 11 基础知识简介 14 Linux 14 Linux产生与发展 14 Linux特点和优势 15 Shell 16 Shell脚本语言与编译型语言的差异 17 Shell分类 18 Shell使用 19 项目一 初识Linux Shell 20 [学习目标] 20 任务1.1 构建开发环境 22 任务1.2 vi/vim编辑器 33 1.2.1 vim使用实例 34 1.2.2 vim按键说明 36 任务1.3 Shell常用命令 41 1.3.1 基础命令 41 1.3.2 文件、目录操作命令 42 1.3.3 系统管理命令 52 1.3.4 关机/重启/退出 53 1.3.5 安装操作命令 53 1.3.6 用户操作命令 54 1.3.7 网络下载命令 55 1.3.8 服务操作命令 57 任务1.4 Shell脚本 58 1.4.1 第一个shell脚本:Hello World 58 1.4.2 脚本介绍 59 1.4.3 shell程序结构 59 1.4.4 shell脚本运行 60 任务1.5 Shell案例:打印有色彩的文本 61 任务1.6 Shell案例:图案打印 62 练习(每题10分,共计100分) 66 项目二 Shell变量 67 [学习目标] 67 任务2.1 Linux环境变量 68 2.1.1 查看环境变量 69 任务2.2 Shell变量 70 2.2.1 定义变量 70 2.2.2 使用变量 70 2.2.3 只读变量 71 2.2.4 删除变量 72 任务2.3 特殊符号 72 任务2.4 Shell案例:显示系统信息: 78 练习(每题12.5分,共计100分) 80 项目三 Shell传递参数 81 [学习目标] 81 任务3.1 Shell传递参数 82 任务3.2 Shell案例:参数比较 85 任务3.3Shell案例:通过参数描述变量 86 练习(前两题每题30分,第三题40分,共计100分) 87 项目四 Shell数组 89 [学习目标] 89 任务4.1 定义数组 90 任务4.2 使用数组 90 任务4.3 Shell案例:数组的使用 92 练习(100分) 95 项目五 Shell运算符 96 [学习目标] 96 任务5.1 Shell基本运算符 97 5.1.1 运算符 97 5.1.2 算术运算符 97 5.1.3 关系运算符 99 5.1.4 布尔运算符 101 5.1.5 逻辑运算符 103 5.1.6 字符串运算符 104 5.1.7 文件测试运算符 106 任务5.2 Shell案例:计算器 109 练习(每题25分,共计100分) 111 项目六 Shell命令输出 112 [学习目标] 112 任务6.1 Shell echo命令 113 任务6.2 Shell printf命令 116 任务6.3 Shell test命令 119 任务6.4 Shell案例:查看系统资源使用情况 122 练习(每题20分,共计100分) 125 项目七 Shell流程控制 126 [学习目标] 126 任务7.1 Shell流程控制 127 7.1.1 if 判断语句 127 7.1.2 for 循环语句 130 7.1.3 while 循环语句 131 7.1.4 until 循环语句 134 7.1.5 case多选语句 135 7.1.6 跳出循环体 137 任务7.2 Shell案例:重复执行命令和简单计算器 139 任务7.3 Shell案例:使用三种循环结构打印九九乘法表 141 练习(前两题每题30分,第三题40分,共计100分) 144 项目八 Shell函数 146 [学习目标] 146 任务8.1 Shell函数 147 8.1.1 Shell中函数的定义 147 8.1.2 函数参数 150 任务8.2 Shell案例 151 8.2.1 指定多个文件的行数 151 8.2.2 当前目录的所有文件 153 练习(每题50分,共计100分) 156 项目九 Shell输入/输出重定向 158 [学习目标] 158 任务9.1 linux文件描述符 159 任务9.2 Shell输入/输出重定向 160 9.2.1 输出重定向 160 9.2.2 输入重定向 163 9.2.3 重定向深入讲解 164 任务9.2 Shell案例:通过重定向测试批量添加ip 166 练习(每题25分,共计100分) 169 项目十 Shell文件包含 171 [学习目标] 171 任务10.1 Shell文件包含 172 任务10.2 Shell案例:查找最大文件 172 练习(每题50分,共计100分) 174 项目十一 Shell文本处理命令 175 [学习目标] 175 任务11.1 学习和使用grep 176 任务11.2 学习和使用sed 179 任务11.3 学习和使用cut 183 任务11.4 学习和使用awk 185 练习(第一题10分,第2-7每题15分,共计100分) 188 项目十二 Shell的调试 189 [学习目标] 189 任务12.1 使用trap命令 190 任务12.2 使用tee命令 192 任务12.3 使用“调试钩子” 193 任务12.4 使用Shell的执行选项 194 练习(每题50分,共计100分) 196 项目十三 Shell综合案例一(lnmp+wordpress) 197 [学习目标] 197 任务13.1 手动安装Linux Nginx Mysql PHP和WordPress 198 13.1.1 准备工作 198 13.1.2 安装Mysql5.6.29 199 13.1.3 安装PHP5.5.12 202 13.1.4 安装Nginx1.10 205 13.1.5 安装WordPress 206 13.1.6 启动网页 207 任务13.2 脚本安装Linux Nginx Mysql PHP 和WordPress 207 13.2.1 初始化安装脚本编写 207 13.2.2 Mysql安装脚本的编写 209 13.2.3 PHP安装脚本的编写 211 13.2.4 Nginx安装脚本的编写 213 13.2.5 WordPress安装脚本的编写 214 13.2.6 验证wordpress 216 练习(每题50分,共计100分) 218 项目十四 shell综合案例二(安装Openstack) 219 [学习目标] 219 任务14.1 手动安装Openstack 220 什么是Openstack 220 14.1.1基本环境准备 222 14.1.2 安装mysql数据库服务 225 14.1.3 安装keystone认证服务 226 14.1.4 安装glance镜像服务 230 14.1.5 安装nova计算服务 233 14.1.6 安装neutron网络服务 238 14.1.7 安装dashboard服务 248 任务14.2 脚本安装openstack 250 14.2.1 基本环境脚本的编写 255 14.2.2 mysql脚本的编写 256 14.2.3 keystone脚本的编写 258 14.2.4 glance脚本的编写 263 14.2.5 nova脚本的编写 266 14.2.6 neutron脚本的编写 270 14.2.7 dashboard脚本的编写 279 14.2.8 验证登录,使用openstack 280 附录Shell编码规范说明 295 1. 什么时候使用shell 295 2.Shell文件和解释器调用 295 3.环境 296 4.注释 296 5.格式 298 6.特性及错误 304 7.命名转换 308 8.调用命令 311

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值