Bash 内置正则表达式与 sed 和 grep 命令

Bash 内置正则表达式与 sed 和 grep 命令

Bash 具有用于模式匹配的内置正则表达式。 sed 和egrep 命令也可以做到这一点。

选择内置 vs 命令有什么好处?我想知道哪个更快以及其他方面比较。

更新:

抱歉,我可能将某些 Bash 功能误认为是正则表达式。

通过“内置正则表达式”,我的意思是 Bash 中提到的字符串操作Bash 字符串操作, 尤其,

去除弦线

stringZ=abcABC123ABCabc
echo ${stringZ#a*C}      # 123ABCabc

字符串替换

stringZ=abcABC123ABCabc
echo ${stringZ/a?c/xyz}       # xyzABC123ABCabc
                              # Replaces first match of 'abc' with 'xyz'.

它们是正则表达式吗?

答案1

解决更新的问题:

严格来说,您所展示的并不是 shell 中正则表达式的应用程序。两者都是使用参数扩展壳球,与您用作文件名通配模式来执行文件名扩展的模式相同,例如cat text*.txt >combined

第一个扩展是标准前缀字符串删除,而第二个扩展是非标准(但由bash其他一些 shell 实现)更通用的替换。都不使用正则表达式,并且您将无法执行相同类型的操作具有 shell 通配模式使用grepsed、 或awk

要在 shell 中使用正则表达式,shell 必须支持它(它不是 Unix shell 的标准功能,尽管许多 shell 提供它),并且您必须使用 shell 提供的语法,在这种情况下bash是使用=~内的运算符[[ ... ]]

指某东西的用途基本的正则表达式(与扩展正则表达式)也可以通过标准实用程序以有限的方式实现expr。但这很少被使用。


解决问题的原始表述:

您可以选择适合手头工作的工具。

工具及其基本用途:

  1. 您可以在 shell中使用=~inside将正则表达式应用于存储在 shell 变量中的字符串。这通常用于测试字符串是否与某个表达式匹配,并可能用于提取子字符串。它非常适合验证用户提供的输入或处理短字符串等任务;[[ ... ]]bash不涉及循环中逐行处理的任务

  2. 您可以用于grep更简单的文件处理任务。它对于根据模式(正则表达式或纯字符串)从流或一个或多个文件中提取行非常有用。它还可以测试输入数据中是否存在一种或多种模式。您用于执行的大多数任务grep也可能由 执行sed,但反之则不然。

  3. 要对文件执行更高级的处理,您可以使用sed.它允许您使用行内正则表达式的替换来编辑流或一个或多个文档。此外,您可以根据绝对行号、正则表达式或指定范围添加、追加、替换或删除行。成为一条溪流编辑,所完成的编辑sed通常与您需要使用文本编辑器进行的编辑类型相同。您用于执行的大多数任务sed也可能由 执行awk,但反之则不然。

  4. 当处理结构化文本数据并需要多功能数据操作时,awk可能比sed.您将用于awk处理文本文件,特别是用于提取特定列、执行数学运算以及应用自定义逻辑来过滤、转换或聚合数据等任务。其中一些处理可能涉及 的awk内置功能,将自定义代码应用于与特定正则表达式匹配的记录,或者在替换等中使用正则表达式。

  5. 某些结构化格式,例如 JSON、YAML、XML 和 CSV(使用比简单的逗号分隔值更高级的引用规则),需要注意并了解格式规则如何在引用和字符编码等方面发挥作用。对于这些类型的数据,应使用专门的处理软件,例如jq、Miller ( mlr)等xmlstarletcsvkit如果手头的任务需要,其中许多工具允许您使用正则表达式安全地处理给定的数据。

从任务开始并选择工具比相反的做法更常见。

相关内容