grep+sed对文本操作比Python脚本快几个数量级
作者:admin 时间:2021-12-14 11:21:26 浏览:在 Linux 中,谈论基本的文本搜索和操作时,grep
和 sed
命令往往会出现。grep
是基于行的搜索实用程序,主要用于从一个或多个文件中返回与特定搜索词匹配的行。sed
是类似的,因为它是一个逐行样式的实用程序,但更多的是用于文本行内的字符串替换。在某些情况下,许多高级用户会将 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
grep
和 sed
的真正强大之处在于结合了 grep
的行匹配和 sed
的替换功能。所以在我们之前的名字示例中,如果我们想搜索一个文件,只获取名字是 Josh 的人,然后将它们格式化为 Last, First,我们可以获取 grep
命令的输出并将其用作 sed
的输入带有 UNIX 管道字符的命令。
grep '^Josh .*$' names.txt | sed 's/\(.*\) \(.*\)/\2, \1/'
Brener, Josh
Chang, Josh
关于正则表达式的说明
grep
和 sed
都使用正则表达式(简称 regex)来定义要匹配的字符序列,以及如何匹配它们的规则。
编写正则表达式匹配器本身就是一门学科,但在某种程度上肯定是一项技能。可以在本文中找到有关正则表达式的更多信息,Linux修改文件内容命令sed对特殊字符的写法。
- 站长推荐