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脚本中的正则表达式[关闭]的主要内容,如果未能解决你的问题,请参考以下文章