在 unix 脚本中从给定的文件名列表创建 json

Create a json from given list of filenames in unix script

你好,我正在尝试编写 unix script/command,我必须在其中列出给定目录中的所有文件名,文件名格式为字符串-{数字}.txt(例如:文件名-1.txt,文件名-2.txt) 我必须从中形成一个 json 对象。任何指示都会有所帮助。

 [{
        "filenumber": "1",
        "name": "filename-1.txt"
    },
    {
        "filenumber": "2",
        "name": "filename-2.txt"
    }
 ]

在上面json文件编号应该从每个文件名的{number}格式读取

凭直觉,我会说你可以用 jq 做到这一点。然而,在实践中,我很少能够用 jq 实现我想要的:-)

午休时间有些不解,想出了这个美图:

ls | jq -R '{filenumber:input_line_number, name:.}' | jq -s .

您可以使用任何其他生成换行符分隔的字符串列表的命令来代替 ls

我尝试了多个示例来实现我的确切用例,最终发现它工作正常,正是我想要的谢谢

 for file in $(ls *.txt); do file_version=$(echo $file | sed 's/\(^.*-\)\(.*\)\(.txt.*$\)//'); jq -n --arg name "$file_version" --arg path "$file" '{name: $name, name: $path}'; done | jq -n '.urls |= [inputs]'

一次调用 jq 就足够了:

shopt -s extglob
printf "%s[=10=]" *-+([0-9]).txt | \
    jq -sR 'split("\u0000") |
            map({filenumber:capture(".*-(?<n>.*)\.txt").n,
                 name:.})'

命令行工具 及其集成的 EXPath 文件模块非常简单:

$ xidel -se '
  array{
    for $x in file:list(.,false(),"*.txt")
    return {
      "filenumber":extract($x,"(\d+)\.txt",1),
      "name":$x
    }
  }
'