技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

grep+sed对文本操作比Python脚本快几个数量级

作者:admin    时间:2021-12-14 11:21:26    浏览:

在 Linux 中,谈论基本的文本搜索和操作时,grepsed 命令往往会出现。grep 是基于行的搜索实用程序,主要用于从一个或多个文件中返回与特定搜索词匹配的行。sed 是类似的,因为它是一个逐行样式的实用程序,但更多的是用于文本行内的字符串替换。在某些情况下,许多高级用户会将 grep 的搜索功能与 sed 的替换功能相结合,以实现比 Python 脚本快几个数量级的高效文本操作。

grep+sed对文本操作比Python脚本快几个数量级

grep

grep 是一个逐行搜索实用程序,它将查看文件的每一行并检查与给定搜索词的匹配项。

假设你有一个未排序的文件(或多个文件)名称。

Kumail Nanjiani
Thomas Middleditch
Amanda Crew
Josh Brener
T.J. Miller
Zach Woods
Martin Starr
Josh Chang

然后假设你只想列出名字为“Josh”的人,你可以编写一个简单的 grep 命令来执行此操作。grep 命令的基本语法是匹配器(例如搜索词)和搜索空间(例如一个或多个文件)。

grep 'Josh .*' names.txt

Josh Brener
Josh Chang

在上面的示例中,grep 将匹配在文件 names.txt 中,以单词“Josh”开头,后跟一个空格字符的任意字符组合的行。

sed

sed 也是一种基于行的工具,最常用于将指定文件中出现的一组字符替换为另一组字符。下面例子是在文件中用“JOSH”替换所有出现的“Josh”这个词。

sed 's/Josh/JOSH/' names.txt

JOSH Brener
JOSH Chang

现在假设我们想从 grep 示例中获取我们的名称列表并对其进行操作,以便名称采用 Last, First 格式。我们可以用 sed 来做到这一点,用括号将匹配器的部分括起来,以便记住它们以备后用。

sed 's/\(.*\) \(.*\)/\2, \1/' names.txt

我们将第一个 .* 匹配器括在括号中以记住空格字符之前的字符序列,然后用第二组括号记住空格之后的所有字符。我们在命令的替换部分重放它们,/1 表示第一个记住的模式,/2 作为我们的第二个记住的模式。

Nanjiani, Kumail
Middleditch, Thomas
Crew, Amanda
Brener, Josh
Miller, T.J.
Woods, Zach
Starr, Martin
Chang, Josh

结合 grep 和 sed

grepsed 的真正强大之处在于结合了 grep 的行匹配和 sed 的替换功能。所以在我们之前的名字示例中,如果我们想搜索一个文件,只获取名字是 Josh 的人,然后将它们格式化为 Last, First,我们可以获取 grep 命令的输出并将其用作 sed 的输入带有 UNIX 管道字符的命令。

grep '^Josh .*$' names.txt | sed 's/\(.*\) \(.*\)/\2, \1/'

Brener, Josh
Chang, Josh

关于正则表达式的说明

grepsed 都使用正则表达式(简称 regex)来定义要匹配的字符序列,以及如何匹配它们的规则。

编写正则表达式匹配器本身就是一门学科,但在某种程度上肯定是一项技能。可以在本文中找到有关正则表达式的更多信息,Linux修改文件内容命令sed对特殊字符的写法

标签: grep  sed  linux技术  
  • IT热文
  • 站长推荐