sed 命令是用于编辑文件的文本编辑器工具。 它可用于替换/删除/向文件添加文本。 它是一个面向流的非交互式文本编辑器。 Sed中的S代表 小号以tream为导向,“ed”部分用于 编伊托尔。
使用 sed 时要注意的一件重要事情是原始输入文件未更改,结果将发送到标准输出。 要将输出重定向到文件,必须使用重定向运算符 (>)。 要更改原始文件(不推荐),可以使用“-i”标志。
sed 命令在流中一次性对文本执行操作,这使得它非常高效。
sed 命令有两个部分。 一个地址和一个命令。 地址指定要进行更改的位置。 地址可以是行号、字符串文字,甚至是正则表达式。 命令部分用于区分插入、删除、替换等各种操作。
目录
- 创建用于编辑的文件
- 替换单词
- 替换多个单词
- 替换时忽略大小写
- 替换所有出现
- 替换选择性出现
- 在每行之后添加一行
- 替换选定行中的单词
- 打印选定的行
- 删除选定的行
- 将 sed 输出保存到文件
- 显示多条连续行
- 打印包含特定单词的行
- 使用正则表达式
- 高级正则表达式替换
- 结论
创建用于编辑的文件
首先,我们将首先创建一个文件,该文件将在本教程中用于应用转换。
$ cat > output.txt
我们要使用的文本是:
Apples are sweet in taste. Apples are red in colour. Orange is sweet too. Orange is Orange in colour. Colour of a fruit can’t be changed. Apples and oranges are healthy. Orange needs to be pealed while an apple can be consumed without pealing. Apples are sometimes green in colour. An orange if green in colour is not ripe enough to eat. Apples and oranges grow on trees. More people like to eat apples. That's about it for apples and oranges.
注意苹果和橙子等单词的多次出现。
替换单词
sed 命令可用于在文本中查找特定单词的出现并替换它。 如果单词的拼写错误并且需要更正,这将很有用。
$ sed 's/colour/color/' output.txt
此命令仅替换每行中目标词的第一次出现。 如果您注意到在第三行中我们有“颜色”,它仍然没有被替换。 这是因为 两个原因:
- 我们编写的命令不会忽略单词的大小写。 也就是说,它是区分大小写的。
- 即使它忽略了大小写,它仍然不会替换一行中单词的第二个实例。
如果您发现单词“peale”和“pealing”拼写错误。 我们可以单独纠正它们
$ sed 's/pealed/peeled/' output.txt

$ sed 's/pealing/peeling/' output.txt

在单独更改它们时,我们看到另一个返回到原始版本。 稍后我们将看到如何使用正则表达式来实现相同的结果。
替换多个单词
在上一个 example,而不是使用 sed 命令两次,我们可以使用单个命令结合两者。
$ sed -i 's/pealed/peeled/;s/pealing/peeling/' output.txt

该命令同时处理两个替换。 这里我们使用“-i”对原始文件进行更改。 这就是为什么我们必须运行 cat 命令来查看原始文件的原因。 不要将此“-i”与用于进行不区分大小写替换的“-i”混淆(请参阅下一个 example)。
替换时忽略大小写
sed 默认区分大小写。 要忽略大小写 -i 标志,可以与 sed 命令一起使用。
$ sed 's/apples/mango/i' output.txt

无论哪种情况,世界苹果的所有第一个实例都已更改为芒果。 您可以看到,在倒数第二行中,我们仍然有“apples”。 作为同一行中单词的第二个实例,它没有被替换。
替换所有出现
正如我们在上面看到的,到目前为止我们一直在使用的命令只查看每行中的第一次出现。 要查看单词的所有实例,请使用 -g 和命令。 让我们再看一下第 3 行中“颜色”的第二个实例。
$ sed 's/colour/color/gi' output.txt
- g 确保查看所有实例
- 我确保匹配不区分大小写

好的! 在第 3 行中,单词 color 的两个实例都已更改为 color。
替换选择性出现
现在假设我们只想更改每行中第二次出现的单词。 这意味着只更改第 3 行中第二次出现的“颜色”。
$ sed 's/colour/color/2i' output.txt

在输出中,第 2 行中唯一出现的颜色和第 3 行中第一次出现的颜色保持原样。 第 3 行中的第二次出现已替换为“颜色”。 倒数第三行也是如此。 通过将 g 替换为任何 n,我们可以使用 sed 替换每行中第 n 次出现的单词。
在每行之后添加一行
有时最好将文件中的每一行隔开。 这可以使用带有 sed 命令的“G”来完成。
$ sed G output.txt

正如我们所看到的,在每行文本之后都添加了一行。
替换选定行中的单词
我们可以提及运行 sed 编辑器工具的特定行。 这只会在明确提到的行中进行更改,而忽略其余部分。
$ sed '2,4 s/Apples/mango/' output.txt

我们可以看到只修改了第 2 到 4 行。 因为我们没有提到 g,所以只有第一次出现的地方被修改了。
打印选定的行
sed 命令可用于显示文件中的特定行。
$ sed -n '2,5p' output.txt

删除选定的行
sed 命令可用于在显示时删除某些行。 该命令不会从实际文件中删除这些行,而是在运行命令时不显示它们。
$ sed '2,5d' output.txt

这不会影响原始文件,因此可以将其视为选择性显示文件的另一种方式。 要将输出保存到另一个文件,我们可以使用重定向运算符。 我们接下来会看到这个。
将 sed 输出保存到文件
通过 sed 命令所做的修改仅在命令行上作为输出可见。 这些输出不会保存,并且更改不会反映在原始文件中。 要将更改保存到文件,可以使用重定向运算符 (>)。
$ sed '2,5d' output.txt > new_file.txt

请注意,如果 new_file.txt 不存在,此命令将创建该文件,然后将输出写入该文件。 该文件将在当前工作目录中创建。
显示多条连续行
就像在同一命令中执行多个替换一样,sed 可用于在单个命令中显示多个连续的行。
$ sed -n -e '2,3p' -e '5,6p' output.txt

显示第 2 到 3 行和第 5 到 6 行。
打印包含特定单词的行
sed 命令可用于打印包含特定单词或模式的行。
$ sed -n /colour/p output.txt
此命令打印所有带有“颜色”字样的行。
$ sed -n /Colour/p output.txt

由于我们没有将 -i 与 sed 命令一起使用,因此这两个命令将给出不同的输出。
使用正则表达式
sed 命令可以与正则表达式一起使用来搜索模式。 正则表达式用于指定可用于匹配文本和查找模式的某些规则。
$ sed ’s/[Cc]olour/color/g’output.txt

这解决了匹配颜色和颜色的问题,因为我们为 [Cc]与这两个事件匹配的颜色。
高级正则表达式替换
早些时候,我们看到了如何将剥皮替换为剥皮和剥皮替换为剥皮。 让我们尝试通过正则表达式来做到这一点。 我们将创建一个正则表达式,它将 peal 更改为 deep 和单词的其余部分。 如果同一个词以多种形式(例如过去、现在或将来)使用,这将很有用。
sed 's/peal([a-z]*)(.*[[:space:]])/peel12/g' output.txt

正则表达式识别 peled 和 peling 并更正它们。 让我们理解正则表达式。
反斜杠用于转义括号等字符,没有它,表达式看起来像:
peal([a-z*])(.*[[:space:]])
- Peal 匹配单词的前四个字母。
- [a-z]* 匹配 peal 后的零个或多个字母。 这将用于匹配“ed”和“ing”
- .* 匹配零个或多个点,用作句号。 用于剥离,因为它发生在最后。
- [[:space:]]匹配单词后的空格。 用于削皮。
- ([a-z]) 被引用为 1 并且可以在替换回来时使用。
- (.*[[:space:]]) 被引用为 2。
在替代方面,我们有:
peel12
反斜杠用于转义数字字符。 这里的剥离后面是来自匹配模式的参考 1,它是“ed”或“ing”。 后跟 2,它可以是空格,也可以是句号。 这个正则表达式成功地实现了以下转换:
- 鸣叫。 -> 脱皮。
- 削皮[space] -> 去皮[space]
结论
sed 命令与正则表达式一起可用于非常强大的文本编辑。 学习更多关于正则表达式 这里. 我们只介绍了 sed 命令的简要适用性。 要了解有关 sed 的更多信息,请参阅 这.