学习shell编程中的神器——sed

本文目录导读:1、什么是sed?2、基础用法3、高级用法4、删除行5、插入和追加文本6、正则表达式在学习shell编程过程中,有一款非常强大的工具——sed。它是一个流编辑器,可以对文本进行各种操作,包括替换、删除、插入等等。如果你熟练掌握了sed,那么在处理文本时将事半功倍。什么是sed?首先我们来看一下sed是什么。Sed(Str……

在学习shell编程过程中,有一款非常强大的工具——sed。它是一个流编辑器,可以对文本进行各种操作,包括替换、删除、插入等等。如果你熟练掌握了sed,那么在处理文本时将事半功倍。

什么是sed?

首先我们来看一下sed是什么。Sed(Stream Editor)是Unix/Linux系统下的一款非交互式编辑器,它只能通过命令行来使用。与其他文本编辑器不同之处在于:其他编辑器都需要打开文件后进行操作;而Sed则直接读取文件,并根据所给定的命令来处理数据并输出到标准输出设备上。

基础用法

现在我们开始介绍如何使用sed进行简单的文本操作。首先我们要知道一个最基本的命令——s(substitute),它用于替换字符串。

下面以一个例子说明:

假设我们有一个名为test.txt的文件,其中包含以下内容:

“`

hello world

现在我们想把world替换成everybody,请执行以下命令:

$ sed ‘s/world/everybody/’ test.txt

执行结果如下:

hello everybody

这里解释一下上述命令中各个部分的含义:

– s:表示substitute,即替换。

– /world/everybody/:这是替换规则。其中第一个斜杠后面跟的是要被替换的字符串,第二个斜杠后面跟的是要替换成的字符串。

如果想直接修改原文件,可以使用-i参数:

$ sed -i ‘s/world/everybody/’ test.txt

此时test.txt中的内容已经被修改为:

高级用法

除了基本用法之外,sed还有很多强大而复杂的功能。下面我们来介绍一些高级用法。

删除行

goodbye world

nice to meet you

现在我们想把包含world这个词语的行全部删除,请执行以下命令:

$ sed ‘/world/d’ test.txt

– /world/:表示匹配包含world这个词语的行。

– d:表示删除匹配到的行。

插入和追加文本

hello world!

goodbye world!

nice to meet you!

现在我们想在每行的末尾加上一个感叹号,请执行以下命令:

$ sed ‘s/$/!/’ test.txt

hello world!!

goodbye world!!

nice to meet you!!

– $:表示匹配每行的末尾。

学习shell编程中的神器——sed

– /!/:表示在每行的末尾添加一个感叹号。

如果我们想在每行开头插入一段文本,可以使用i参数。比如我们要在每行开头插入一段话“Here is a new line”,则可以执行以下命令:

$ sed ‘i Here is a new line’ test.txt

Here is a new line

正则表达式

sed支持正则表达式,因此我们可以使用正则表达式来进行更加复杂的文本操作。比如我们有一个名为test.txt的文件,其中包含以下内容:

1 apple 10.2 USD

2 banana 20.3 USD

3 cherry 30.4 USD

4 date 40.5 USD

5 elderberry 50.6 USD

6 figs 60.7 USD

7 grapefruit 70.8 USD

8 honeydew melon 80.9 USD

9 kiwi fruit 90.0 USD

10 lemonade with sugar and ice cubes and mint leaves and watermelon flavoring 100.1 USD

现在我们想把所有水果的价格都加上20,请执行以下命令:

$ sed -E ‘s/(^ *[0-9]+ )([a-z ]+)([0-9]+.[0-9]+ USD)/12$(echo 3+20 | bc) USD/’ test.txt

2 banana $(echo 20.3+20 | bc) USD

3 cherry $(echo 30.4+20 | bc) USD

4 date $(echo 40.5+20 | bc) USD

5 elderberry $(echo 50.6+20 | bc) USD

6 figs $(echo 60.7+20 | bc) USD

7 grapefruit $(echo 70.8+20 | bc) USD

8 honeydew melon $(echo 80.9+20 | bc) USD

9 kiwi fruit $(echo 90.0+20 | bc) USD

10 lemonade with sugar and ice cubes and mint leaves and watermelon flavoring $120.1USD

– -E:表示使用扩展正则表达式。

– (^ *[0-9]+ ):表示匹配行首的数字和空格。

– ([a-z ]+):表示匹配水果名称。

– ([0-9]+.[0-9]+USD):表示匹配价格。

– 1、2、3:分别代表第一部分、第二部分和第三部分的内容。这里用到了引用组的功能。

– $(echo 3+20 | bc) USD:表示把价格加上20后再输出,并且添加上USD后缀。

以上就是sed的一些基础和高级用法。通过学习,我们可以看到sed在文本处理中是非常强大而实用的工具。希望这篇文章对你有所帮助,也希望你能够深入学习并掌握这个神器。