如何在 shell 脚本中使用正则表达式?

     2023-02-23     298

关键词:

【中文标题】如何在 shell 脚本中使用正则表达式?【英文标题】:How do I use a regex in a shell script? 【发布时间】:2016-06-25 10:50:33 【问题描述】:

我正在尝试将字符串与 shell 脚本中的正则表达式匹配。 此字符串是脚本的参数 ( $1 ),它是日期 (MM/DD/YYYY) 我正在尝试使用的正则表达式是:

^\d2[\/\-]\d2[\/\-]\d4$

它似乎有效,我在几个正则表达式测试网站上尝试过。

我的shell代码是:

REGEX_DATE="^\d2[\/\-]\d2[\/\-]\d4$"
 
echo "$1" | grep -q $REGEX_DATE
echo $?

“回声$?”无论我放入参数中的字符串是什么,都返回 1。

你们有什么想法吗?

谢谢!

【问题讨论】:

这可能是***.com/questions/19737675/…的一种重复 那是因为$? 报告了管道链中的第一个命令,即 echo - echo 显然会成功,所以你会得到一个 1 退出代码。试试grep $pattern <<< $1 请参阅this question 了解一种解决方案。 始终检查您的程序文档以查看可接受的正则表达式样式。 @MarcB err,不,恰恰相反——$? 是管道中的最后一个退出状态 【参考方案1】:

补充现有的有用答案:

在这种情况下,使用 Bash 自己的正则表达式匹配运算符 =~ 是一种更快的选择,因为您只匹配已经存储在变量中的单个值:

set -- '12-34-5678' # set $1 to sample value

kREGEX_DATE='^[0-9]2[-/][0-9]2[-/][0-9]4$' # note use of [0-9] to avoid \d
[[ $1 =~ $kREGEX_DATE ]]
echo $? # 0 with the sample value, i.e., a successful match

但请注意,使用特定风格的正则表达式结构(例如 \d)的警告同样适用: 虽然=~ 支持 ERE(扩展 正则表达式),但它也支持主机平台的特定扩展 - 这是 Bash 行为依赖于平台的罕见情况。

为了保持可移植性(在 Bash 的上下文中),请遵守 POSIX ERE 规范。

请注意,=~ 甚至允许您定义 捕获组(带括号的子表达式),您以后可以通过 Bash 的特殊 $BASH_REMATCH[@] 数组变量访问其匹配项。

补充说明:

$kREGEX_DATE 使用 unquoted,这是识别正则表达式所必需的(引用的部分将被视为 文字)。 p>

虽然并非总是必要的,但建议先将正则表达式存储在变量中,因为 Bash 无法处理包含 \ 的正则表达式 literals

例如,在 Linux 上,\< 支持匹配单词边界,[[ 3 =~ \<3 ]] && echo yes 不起作用,但 re='\<3'; [[ 3 =~ $re ]] && echo yes 可以。

我已将变量名称 REGEX_DATE 更改为 kREGEX_DATEk 表示(概念)常量),以确保名称不是全大写名称,因为 @987654322 @。

【讨论】:

【参考方案2】:

我想这就是你想要的:

REGEX_DATE='^\d2[/-]\d2[/-]\d4$'

echo "$1" | grep -P -q $REGEX_DATE
echo $?

我使用 -P 开关来获取 perl 正则表达式。

【讨论】:

澄清一下,-P 不保证在所有发行版中都受支持。所以如果便携性是一个问题,你会想要避免它。 在这种情况下,@MikeFrysinger 的解决方案更可取。这个有点使用原始正则表达式的吸引力,给予或接受一些转义。【参考方案3】:

问题是您尝试使用 grep 不支持的正则表达式功能。即,您的 \d 将不起作用。改用这个:

REGEX_DATE="^[[:digit:]]2[-/][[:digit:]]2[-/][[:digit:]]4$"
echo "$1" | grep -qE "$REGEX_DATE"
echo $?

您需要-E 标志来获取ERE 才能使用# 样式。

【讨论】:

++;请注意,如果您 \ -转义了 实例,则此特定正则表达式在没有 -E 的情况下也可以作为 BRE(基本正则表达式)工作;作为不可移植的旁白:BSD/OSX grep - 不像 GNU grep - 实际上确实支持 \d 你当然是对的;但是我更喜欢 -E 而不是到处都是 `` 因为它使代码更具可读性,并且它位于 POSIX 中。

如何在 shell 脚本中将此正则表达式与 grep 一起使用?

】如何在shell脚本中将此正则表达式与grep一起使用?【英文标题】:Howtousethisregexwithgrepinshellscript?【发布时间】:2022-01-1400:16:01【问题描述】:我需要在shell脚本中提取公钥,不知道如何使用它。我是shell脚本的新手。https://regex1... 查看详情

bash:在 shell 脚本中使用正则表达式查找和 grep

】bash:在shell脚本中使用正则表达式查找和grep【英文标题】:bash:findandgrepwithregexinshellscript【发布时间】:2022-01-1318:41:18【问题描述】:我安装了某个软件的多个版本(我们称之为MySoftware),我喜欢通过find和grep的组合找到特定... 查看详情

如何在 bash 脚本中使用正则表达式?

】如何在bash脚本中使用正则表达式?【英文标题】:HowdoIuseregularexpressionsinbashscripts?【发布时间】:2010-09-2305:20:14【问题描述】:我想使用正则表达式检查变量是否具有有效年份。阅读bashmanual我知道我可以使用运算符=~查看下面... 查看详情

如何使用 Ruby 编写 shell 脚本?

...一些简单的shell脚本任务想要完成例如:从匹配某个正则表达式的文件列表中选择工作目录中的文件。我知道我可以使用标准的bash和grep来做这种事情,但是我很高兴能够破解可以在windows和linux中运行的快速脚本,而无需我记住... 查看详情

如何在 bash 脚本中使用正则表达式否定测试?

】如何在bash脚本中使用正则表达式否定测试?【英文标题】:HowdoInegateatestwithregularexpressionsinabashscript?【发布时间】:2011-05-3108:59:01【问题描述】:使用GNUbash(版本4.0.35(1)-release(x86_64-suse-linux-gnu),我想用正则表达式否定一个测... 查看详情

如何在 bash 脚本中使用正则表达式否定两个逻辑测试?

】如何在bash脚本中使用正则表达式否定两个逻辑测试?【英文标题】:HowdoInegatetwologictestswithregularexpressionsinabashscript?【发布时间】:2017-09-2118:34:45【问题描述】:在bash中,我们想做如下逻辑:如果变量"$SLACK"是TRUE并且$O... 查看详情

外壳脚本。如何使用正则表达式提取字符串

】外壳脚本。如何使用正则表达式提取字符串【英文标题】:shellscript.howtoextractstringusingregularexpressions【发布时间】:2013-11-1307:09:10【问题描述】:我是shell脚本的新手。我想使用curl发送一个http请求,然后使用正则表达式提取一... 查看详情

如何在 linux shell 中使用正则表达式从文件中提取 IP 地址?

】如何在linuxshell中使用正则表达式从文件中提取IP地址?【英文标题】:HowdoyouextractIPaddressesfromfilesusingaregexinalinuxshell?【发布时间】:2010-09-3011:45:01【问题描述】:如何在linuxshell中通过正则表达式提取文本部分?可以说,我有... 查看详情

shell脚本正则表达式grepsedawk工具

正则表达式定义正则表达式,又称正规表达式、常规表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串·正则表达式组成普通字符大小写字母、数字、标点符号及一些其他符号元字符在正则表达式中具有特... 查看详情

shell脚本之正则表达式(代码片段)

一、基础正则表达式实例:元字符总结:在Linux系统中常见的文件处理工具中grep和sed支持基础正则表达式。grep命令选项:-i:查找时不区分大小写;-v:查找时反向输出,如查找不包含某些字符的内容;-n:表示查找出结果后显... 查看详情

如何使用正则表达式从某些文本中提取脚本标签?

】如何使用正则表达式从某些文本中提取脚本标签?【英文标题】:HowcanIextractascripttagfromsometextusingRegex?【发布时间】:2010-08-1212:54:32【问题描述】:我不太了解正则表达式,我正在尝试从一些提取的页面文本中获取所有脚本标... 查看详情

使用批处理脚本,如何使用正则表达式拆分 .csv 文件中的数据?

】使用批处理脚本,如何使用正则表达式拆分.csv文件中的数据?【英文标题】:UsingaBatchscript,howdoIuseregextosplitupdataina.csvfile?【发布时间】:2019-10-0922:08:51【问题描述】:我有一个.csv文件(通过导出googleDoc电子表格生成),我需... 查看详情

shell脚本——正则表达式(包含grep详细介绍及应用)(代码片段)

正则表达式正则表达式的作用前言案例:使用^和$判断用户输入的是否是数字基础正则表达式元字符基础正则表达式元字符案例扩展正则表达式元字符扩展正则表达式元字符案例正则表达式元字符综合案例三剑客grep详解grep的... 查看详情

linux使用之grep,shell脚本(一)

...全局搜索的意思。全称中的“RegularExpression”意思为正则表达式。所以从全称中就可以理解为gerp是一个可以利用正则表达式的全局搜索工具。grep会按照正则表达式的匹配原则在文本文件中按照逐行匹配处理的方法来处理文本并... 查看详情

shell脚本——正则表达式(代码片段)

...扩展正则三、第二类正则四、正则练习一、基本概念正则表达式(RegularExpression、regex或regexp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指 查看详情

在 Python 脚本中使用正则表达式 [重复]

】在Python脚本中使用正则表达式[重复]【英文标题】:UsingregexinPythonscript[duplicate]【发布时间】:2019-07-1313:21:34【问题描述】:我正在尝试编写一个python脚本来搜索和替换这一行:时间剩余3总计空行。这是我的脚本:importglobread_f... 查看详情

shell脚本学习笔记12-正则表达式

一、正则表达式介绍  正则表达式(RegularExpression、regex或regxp,缩写为RE),也译为正规表示法、常规表示法,是一种字符模式,用于在查找过程中匹配指定的字符。  支持正则表达式的程序如:locate|find|vim|grep|sed|awk 二... 查看详情

可以在这个 PowerShell 脚本中使用正则表达式吗?

】可以在这个PowerShell脚本中使用正则表达式吗?【英文标题】:CouldregexbeusedinthisPowerShellscript?【发布时间】:2021-12-0522:17:52【问题描述】:我有以下代码,用于从字符串$m中删除空格和其他字符,并将它们替换为句点(\'.\'):F... 查看详情