Linux利器学习之sed命令

前言

网上很多Linux学习都是简单的把命令列出来,然后背,但是这样的结果就是如果不是经常用的话就是前面记后面忘,而且记得不全。所以我决定换个方式学习Linux的常用命令。今天就从sed开始,学好这个工具,对于我们平常在linux做项目部署运维相当有帮助,能大大提高我们的工作效率,马上来看一下这款神器吧。

一、sed是什么?

相信很多人接触sed命令都是从它能够批量替换文本开始的,比如:

sed -i 's/192.168.1.211/172.16.2.202/g' application.properties

这行命令的作用是将application.properties文件中的192.168.1.211字符全部替换成172.16.2.202,这个操作是我们经常在部署软件时修改配置文件最常用的一句了。

对于sed软件,官方首页上给了这么一段话描述:

sed (stream editor) is a non-interactive command-line text editor.

# Example: delete the 4th line in a file
$ sed '4d' input.txt > output.txt

# Example: replace every occurrence of 'hello' with 'world' on lines 10-20
$ sed '10,20s/hello/world/' input.txt > output.txt

sed is commonly used to filter text, i.e., it takes text input, performs some operation (or set of operations) on it, and outputs the modified text. sed is typically used for extracting part of a file using pattern matching or substituting multiple occurrences of a string within a file.

大致的意思是:sed是一个非交互式的命令行文本编辑器(vim就是属于交互式的是编辑器),通常是用于处理文本。**它的工作流程是接收一个或文本输入,然后做一些处理,再将修改的文本做标准输出。**它通常被用于提取文件的一部分,或者是批量替换文件中的多处内容。

sed是一个流式文本编辑器,它能够读取一个或者多个文本文件,然后根据脚本命令对文本内容作出修改,再将结果输出。处理文本的脚本命令可以来自于-e参数中的命令操作,也可以是-f参数中的脚本文件。

sed能够做哪些操作?增、删、改、查都可以!

二、sed的语法

2.1 基础语法
sed [-n] script[file...]
sed [-n] [-e script] ... [-f script_file] ... [file]
2.2 参数说明
  • -e script, --expression script

    以script中指定的命令来处理文本

  • -f script_file, --file=script_file

    以script_file指定的脚本文件来处理文本

  • -n--quiet, --silent

    不要输出结果,除非有指令动作要求这么做

  • -i[suffix], --in-place[=suffix]

    以替换的方式编辑文本,如果提供了suffix的话,就会备份一个编辑前的文件出来

  • -h

    显示帮助

  • --version

    显示版本信息

常用的几个选项就这几个了,其他选项可以使用-h查看官方说明(贴多了你也记不住!!!)

2.3 script说明

在script当中我们可以使用以下这些命令动作,更详细的可以参考官网文档

特别说明:以下命令中text为任意字符串代表

  • a\texta text

    新增,在a的后面接字符串,那么这些字符串就会在当前行的下一行添加数据

  • c\textc text

    取代,在c后面接字符串,可以取代n1,n2之间的行

  • d

    删除,删除当前行

  • i\texti text

    插入, 在i后面接字符串,那么该字符串就会出现在当前行的上一行

  • p

    打印,将选择的某个数据打印出。通常与正则表达式和sed -n 一起搭配运行

  • s/regexp/replacement/[flag]

    正则替换,如s/hello/world/g, 将所有的hello替换成world

当然也可以在script中使用C语言的函数

另外以上的命令可以组合成一组命令,每个命令之间以;号分割,这一组命令用花括号{}包裹。

要点及注意事项

(1)sed是基于行来处理文本的,所以当接收一个多行文本文件时,它是按照行的顺序一行一行的处理文本。这一点对于我们理解sed非常重要,否则你可能就在后续的操作中不懂为啥输出结果与预期的不一样了。

sed 'd' test.txt
# 假设test.txt文本中有以下2行数据
# hello java
# hello sed
# 想一下结果是什么呢?(自己动手哦!)

(2)sed默认情况下是只将文件作为输入读取,修改操作并不会保存到源文件中,只是将修改后的内容标准输出(输出到控制台),所以如果你发现你的sed命令并没有完成字符串替换,不要大惊小怪。

sed 's/hello/world/g' test.txt
# 还是一样的test.txt
# hello java
# hello sed
# 想一下test.txt中变成了什么样?(自己动手哦!)

(3) 在写script脚本的时候,最好带上单引号,这样可以防止跟shell扩展混淆。

(4) 细心的同学可能发现了,上述例子中我使用script的时候并没有写-e的选项,这并不是写错了,而是sed支持这种写法,当没有-e 选项的时候,默认会选择命令中第一个无指定选项的参数作为script脚本来执行

# 所以以下两种写法是等同的
sed 'd' test.txt
sed -e 'd' test.txt

(5) 如何指定行操作文本(行定位)?

​ 我们知道sed是基于每一行操作的,但是往往我们只想修改其中的几行,该如何操作呢?sed提供了地址定位。举例说明:假如我们要删除test.txt文件中的第一行,命令该如何写?

sed '1d' test.txt

很简单,我们在动作命令前加入行号即可,如果是多行呢?

# 删除1-10行内容
sed '1,10d' test.txt

我们也可以利用正则表达式来操作

# 删除 test.txt中以va结尾的字符
sed '/va$/d' test.txt
# 删除test.txt中包含s的字符串
sed '/s/d' test.txt

同样上述三种操作适用于其他的script动作,如前面提到的批量替换ip地址的操作

三、sed示例练习

假设我们的练习文件test.txt内容为:

hello java
hello sed
hello chengcheng
hello bugdongdong

思考以下动作会产生什么样的结果?

3.1 增
# 在第二行后加入hello spring
sed '2a\hello spring' test.txt
3.2 删
# 删除3到最后一行
sed '3,$d' test.txt
# $代表最后一行,但是^不代表第一行哦,会报错的
3.3 改
# 替换hello为www
sed 's/hello/www/g' test.txt
3.4 查
# 查询有java的行内容
sed -n '/java/p' test.txt
3.5 复合操作
# 先删除第一行,再在第2行后加入内容
sed -e '1d' -e '2a\hello me' test.txt
# 查找有java字符的行,并把该行的hello替换成www
sed -n '/java/{s/hello/www/g;p;q}' test.txt

四、sed的优势

  • 批量操作文本

    我们知道sed是一个非交互式的文本编辑器,虽然相对于交互式的文本编辑器来讲,sed有一些劣势,但是这并不影响他在另一方面的优秀。尽管交互式的文本编辑有天然的优势,比如直观,想改哪里就将光标挪过去直接操作即可,但是这个既是优势也是交互式编辑器的劣势所在。怎么说?比如我们在改一组软件的配置文件时,可能需要改多个配置文件中的服务器IP地址和账号密码,我们使用交互式的文本编辑器的话,就得一个一个文件打开,找到地方,修改,然后挨个保存, 浪费时间且没有任何技术含量。但是如果我们使用sed的话,可能一行命令就解决了,这就是sed的优势所在,即批量操作文本

  • 轻量级

    sed要比很多脚本语言要轻量

  • 流式处理

    前面我们讲了sed是一个流式文本编辑器,它不仅可以修改磁盘上的文本文件,更重要的是它可以接受标准的输入流,这个特性决定了当它配合其他shell命令和管道符的时候,它能处理的工作就相当的灵活好用。而且sed在处理文本时不受文本长度影响

Reference

http://www.gnu.org/software/sed/

https://www.gnu.org/software/sed/manual/sed.html#sed-script-overview

https://www.ibm.com/developerworks/linux/library/l-sed1/index.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值