Unix shell脚本中的正则表达式[关闭]

Posted

技术标签:

【中文标题】Unix shell脚本中的正则表达式[关闭]【英文标题】:Regex in Unix shell script [closed] 【发布时间】:2014-10-17 17:55:48 【问题描述】:

我需要将文件名与模式“myTestData_[YYYYMMDD][HHMMSS][NNN].csv.gz”匹配。样本匹配文件名为“myTestData_20140821_052354_001.csv.gz”

这里 myTestData_.csv.gz 是常量,YYYYMMDD 和 HHMMSS 来自时间戳。 NNN 是任意 3 位数字。能否请您告知我在 Unix 脚本中的正则表达式模式应该是什么。

这是我正在尝试的代码:

infile='fileNameSamples.csv'
while read line ; do
    if [[ $line =~ ^myTestData_\d8_\d6_\d3.csv.gz$ ]] ; then
        echo 'matched:'$line
      else
        echo 'failed'
    fi
done < "$infile"

这是 fileNameSamples.csv 中的文件名:

myTestData_20140821_001.csv.gz
TestData_20140821_001.csv.gz
myTestData_20140821_001.csv.g
myTestData_20140821_002.csv.gz

当我执行它时,如果我替换它,它会为所有文件返回 false

if [[ $line =~ ^myTestData_\d8_\d6_\d3.csv.gz$ ]] ; then

 if [[ $line =~ ^(.*)([0-9]8)(.*)$ ]] ; then

它返回所有文件,意味着我在正则表达式中使用常量字符串时遇到问题,请指出我在做什么错误。

非常感谢! 阿米特

【问题讨论】:

匹配它然后用它做什么?提供一些背景信息会很有帮助,理想情况下,向我们展示您已经尝试过的内容。 【参考方案1】:

您的代码有两个问题:

    \d 在 POSIX 正则表达式中不起作用。使用[[:digit:]][0-9]

    在您的问题中,您说文本的格式为 myTestData_[YYYYMMDD][HHMMSS][NNN].csv.gz,但是 CSV 文件中的数据不包含 [HHMMSS] 部分。您尝试的正则表达式需要 8 位数字,后跟下划线,后跟 6 位数字,后跟下划线,后跟 3 位数字。 CSV 文件中没有一行与此匹配。

此正则表达式匹配 CSV 文件中的行:

if [[ $line =~ ^myTestData_[[:digit:]]8_[[:digit:]]3\.csv\.gz$ ]] ; then

【讨论】:

@AmitMittal 欢迎使用 ***。说“谢谢”的首选方式是接受对您提出的任何问题最有帮助的答案(点击绿色复选标记)(这也会提高您的声誉),并通过投票给有帮助的答案(如果您有 15 + 声誉)。请阅读tour,祝你好运。

以上是关于Unix shell脚本中的正则表达式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

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

Shell编程之正则表达式

shell-正则表达式

shell脚本编程之正则表达式(扩展正则表达式sed)

Shell编程之正则表达式三剑客——awk工具

shell脚本——正则表达式Sed与Awk文本处理工具详解