sssssssssss
sed 命令是用于编辑文件的文本编辑器工具。 它可用于替换/删除/添加文本到文件。 它是一个面向流的非交互式文本编辑器。 Sed 中的 S 代表 秒以流为导向,“ed”部分用于 编辑它。
使用 sed 时要注意的一件重要事情是原始输入文件没有改变,结果被发送到标准输出。 要将输出重定向到文件,必须使用重定向运算符 (>)。 要更改原始文件(不推荐),可以使用“-i”标志。
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.
请注意多次出现的单词,例如 apples 和 oranges。
替换单词
sed 命令可用于查找文本中出现的特定单词并替换它。 如果单词拼写错误并且需要更正,这会很有用。
$ sed 's/colour/color/' output.txt
此命令仅替换每行中第一次出现的目标单词。 如果您注意到在第三行我们有“颜色”,它仍然没有被替换。 这是因为 两个原因:
- 我们编写的命令不会忽略单词的大小写。 也就是说,它是区分大小写的。
- 即使它忽略了大小写,它仍然不会替换一行中单词的第二个实例。
如果您注意到单词 ‘peled’ 和 ‘peling’ 拼写错误。 我们可以单独纠正它们
$ sed 's/pealed/peeled/' output.txt
$ sed 's/pealing/peeling/' output.txt
在单独更改它们时,我们看到另一个返回到原始版本。 稍后我们将看到如何使用正则表达式来实现相同的结果。
替换多个单词
在前面的示例中,我们可以使用将两者结合的单个命令,而不是使用两次 sed 命令。
$ sed -i 's/pealed/peeled/;s/pealing/peeling/' output.txt
此命令同时处理两个替换。 这里我们使用“-i”对原始文件进行更改。 这就是为什么我们必须运行 cat 命令才能看到原始文件。 不要将此“-i”与用于进行不区分大小写替换的“-i”混淆(参见下一个示例)。
替换时忽略大小写
默认情况下 sed 区分大小写。 忽略大小写 -i 标志可以与 sed 命令一起使用。
$ sed 's/apples/mango/i' output.txt
不管情况如何,世界上所有第一个苹果实例都已更改为芒果。 你可以看到在倒数第二行我们仍然有“苹果”。 作为同一行中单词的第二个实例,它没有被替换。
替换所有出现
正如我们在上面看到的,到目前为止我们一直使用的命令只查看每一行中的第一次出现。 要查看单词的所有实例,请使用 -g 和命令。 让我们再看看第 3 行中 ‘Colour’ 的第二个实例。
$ sed 's/colour/color/gi' output.txt
- g 确保查看所有实例
- 我确保匹配不区分大小写
好的! 在第 3 行中,color 一词的两个实例都已更改为 color。
替换选择性发生
现在假设我们只想更改每行中单词的第二次出现。 这意味着只更改第 3 行中第二次出现的“颜色”。
$ sed 's/colour/color/2i' output.txt
在输出中,第 2 行中唯一出现的颜色和第 3 行中第一次出现的颜色保持原样。 第 3 行中的第二次出现已被 ‘color’ 替换。 倒数第三行也是如此。 通过将 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]olour 匹配这两个事件。
高级正则表达式替换
早些时候,我们看到了如何将 peled 替换为peeled 和 peling 到peeling。 让我们尝试通过正则表达式来做到这一点。 我们将创建一个正则表达式,将peal 更改为peal 和单词的其余部分。 如果同一个词以多种形式使用,例如过去、现在或将来,这会很有用。
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
反斜杠用于转义数字字符。 这里,peel 后面是匹配模式中的参考 1,它是 ‘ed’ 或 ‘ing’。 后跟 2 是空格或句号。 这个正则表达式成功实现了以下转换:
- 发出嘶嘶声。 -> 脱皮。
- 剥落[space] -> 去皮[space]
结论
sed 命令与正则表达式一起可用于非常强大的文本编辑。 在此处学习有关正则表达式的更多信息。 我们只介绍了 sed 命令的简要适用性。 要了解有关 sed 的更多信息,请参阅此内容。