启用正则表达式的Linux查找命令未返回

时间:2019-04-15 23:46:50

标签: bash tdd shunit2

作为bash脚本的新手,我决定从一开始就尝试对当前项目进行单元测试。目前,我对单行代码有疑问。我正尝试用它在目录output_json中搜索与正则表达式匹配的文件。

在显示任何代码之前,这里是脚本运行的目录结构:

工作目录的完整路径:

C:\Users\chris\Google Drive\code projects\Replacement Program for Chile Letters\tests\general bash unit tests.

当前工作目录的目录树:

├───general bash unit tests  <--(working dir)
    ├───node_fake_returns
    └───output_json
        ├───email_data-1.json
        ├───email_data-2.json
        ├───email_data-3.json
        ├───variable_data-1.json 
        ├───variable_data-2.json
        └───variable_data-3.json

我要用来返回包含variable_data文件的所有文件名的数组的行如下:

local contentVars=$(find "./output_json" -regextype posix-extended \
  -regex '.*/output_json/variable_data-\d+.json')

这里是用于单元测试的全部功能,以防万一我在单元测试中遇到其他问题。请注意,断言函数来自shunit2。

testFileNameCapturing() {

    local contentVars=$(find "./output_json" -regextype posix-extended \
      -regex '.*/output_json/variable_data-\d+.json')
    local emailDataVars=$(find "./output_json" -regextype posix-extended \
      -regex 'variable_data-\d+.json')

    assertTrue "[ $contentVars == './output_json/variable_data-1.json' ]"
}

我确定这只是一个很小的语法错误,但这确实使我停滞了整整一天的时间。任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

我有两个部分。关于您的正则表达式问题,以及简化单元测试代码。


在正则表达式上:

在正则表达式上,我同意GNU find对正则表达式的处理有些奇怪。

找到here的GNU find正则表达式文档。

如果使用默认的GNU find正则表达式,则可以这样编写:

▶ find ./output_json -regex './output_json/variable_data-[0-9]+\.json'                       
./output_json/variable_data-1.json
./output_json/variable_data-3.json
./output_json/variable_data-2.json

但是,使用POSIX扩展名,我希望和您\d匹配一个数字。例如here

但是在GNU中找到posix扩展的正则表达式docs,没有提到\d,只有[[:digit:]]

因此,这可行:

▶ find "./output_json" -regextype posix-extended -regex './output_json/variable_data-[[:digit:]]+\.json'
./output_json/variable_data-1.json
./output_json/variable_data-3.json
./output_json/variable_data-2.json

在修改代码时:

我认为您应该简化代码并完全避免使用正则表达式,而只需使用glob模式:

local contentVars=$(find ./output_json -name "variable_data-[0-9]*.json")

这更简单,更容易理解,并且不依赖于GNU扩展,因此更加可移植。

但是,这不会返回数组,而是返回一个以换行符分隔的字符串以及您做出的断言:

assertTrue "[ $contentVars == './output_json/variable_data-1.json' ]"

应该失败。也许尝试:

testFileNameCapturing() {
  local contentVars=$(find output_json/ -name "variable_data-[0-9]*.json")

  local expected="output_json/variable_data-1.json
output_json/variable_data-3.json
output_json/variable_data-2.json"

  assertEquals "$expected" "$contentVars"
}

. shunit2

输出:

testFileNameCapturing

Ran 1 test.

OK