在 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:.})'
命令行工具 xidel 及其集成的 EXPath 文件模块非常简单:
$ xidel -se '
array{
for $x in file:list(.,false(),"*.txt")
return {
"filenumber":extract($x,"(\d+)\.txt",1),
"name":$x
}
}
'
你好,我正在尝试编写 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:.})'
命令行工具 xidel 及其集成的 EXPath 文件模块非常简单:
$ xidel -se '
array{
for $x in file:list(.,false(),"*.txt")
return {
"filenumber":extract($x,"(\d+)\.txt",1),
"name":$x
}
}
'