【问题标题】:Regex in Unix shell script [closed]Unix shell脚本中的正则表达式[关闭]
【发布时间】: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_\d{8}_\d{6}_\d{3}.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_\d{8}_\d{6}_\d{3}.csv.gz$ ]] ; then

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

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

非常感谢! 阿米特

【问题讨论】:

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

标签: regex string shell unix


【解决方案1】:

您的代码有两个问题:

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

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

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

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

【讨论】:

  • @AmitMittal 欢迎使用 StackOverflow。说“谢谢”的首选方式是接受对您提出的任何问题最有帮助的答案(点击绿色复选标记)(这也会提高您的声誉),并通过投票给有帮助的答案(如果您有 15 + 声誉)。请阅读tour,祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 2019-03-27
  • 2016-06-06
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2015-07-15
相关资源
最近更新 更多