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 通配模式使用grep
、sed
、 或awk
。
要在 shell 中使用正则表达式,shell 必须支持它(它不是 Unix shell 的标准功能,尽管许多 shell 提供它),并且您必须使用 shell 提供的语法,在这种情况下bash
是使用=~
内的运算符[[ ... ]]
。
指某东西的用途基本的正则表达式(与扩展正则表达式)也可以通过标准实用程序以有限的方式实现expr
。但这很少被使用。
解决问题的原始表述:
您可以选择适合手头工作的工具。
工具及其基本用途:
您可以在 shell中使用
=~
inside将正则表达式应用于存储在 shell 变量中的字符串。这通常用于测试字符串是否与某个表达式匹配,并可能用于提取子字符串。它非常适合验证用户提供的输入或处理短字符串等任务;[[ ... ]]
bash
不涉及循环中逐行处理的任务。您可以用于
grep
更简单的文件处理任务。它对于根据模式(正则表达式或纯字符串)从流或一个或多个文件中提取行非常有用。它还可以测试输入数据中是否存在一种或多种模式。您用于执行的大多数任务grep
也可能由 执行sed
,但反之则不然。要对文件执行更高级的处理,您可以使用
sed
.它允许您使用行内正则表达式的替换来编辑流或一个或多个文档。此外,您可以根据绝对行号、正则表达式或指定范围添加、追加、替换或删除行。成为一条溪流编辑,所完成的编辑sed
通常与您需要使用文本编辑器进行的编辑类型相同。您用于执行的大多数任务sed
也可能由 执行awk
,但反之则不然。当处理结构化文本数据并需要多功能数据操作时,
awk
可能比sed
.您将用于awk
处理文本文件,特别是用于提取特定列、执行数学运算以及应用自定义逻辑来过滤、转换或聚合数据等任务。其中一些处理可能涉及 的awk
内置功能,将自定义代码应用于与特定正则表达式匹配的记录,或者在替换等中使用正则表达式。某些结构化格式,例如 JSON、YAML、XML 和 CSV(使用比简单的逗号分隔值更高级的引用规则),需要注意并了解格式规则如何在引用和字符编码等方面发挥作用。对于这些类型的数据,应使用专门的处理软件,例如
jq
、Miller (mlr
)等xmlstarlet
。csvkit
如果手头的任务需要,其中许多工具允许您使用正则表达式安全地处理给定的数据。
从任务开始并选择工具比相反的做法更常见。