当前位置:   article > 正文

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

linux】shell与文本处理实训

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/812043
推荐阅读
相关标签
  

闽ICP备14008679号