jq substr() 相当于格式化一个值

Wil*_*Wil 3 string json substr slice jq

希望你在这些时候一切都好。

我遇到了一个问题,希望你有更多的知识。

使用 'jq' 我想更改所有日期,例如。19731013(字符串)到 1973-10-13

[
    {
        "Mail": "john@example.com",
        "Name": "Smith",
        "Employee_Number": "000555",
        "First_Name": "John",
        "Company": "ACME",
        "Department": null,
        "Employment_Status": "Retiree",
        "Start_Date": "19770516",
        "Function_Start_Date": "19770516",
        "Group_Phone": "",
        "Job_Title": "Operations Manager Warehousing",
        "Sub_Group": "Exempts",
        "Location": "Tibuktu",
        "Organizational_Unit": null,
        "Date_of_Birth": "19560719",
        "Gender": "1"
    },
    {
        "Mail": "mary@example.com",
        "Name": "Smith",
        "Employee_Number": "000777",
        "First_Name": "Mary",
        "Company": "ACME",
        "Department": null,
        "Employment_Status": "Retiree",
        "Start_Date": "19770516",
        "Function_Start_Date": "19770516",
        "Group_Phone": "",
        "Job_Title": "Manager",
        "Sub_Group": "Exempts",
        "Location": "Tibuktu",
        "Organizational_Unit": null,
        "Date_of_Birth": "19560719",
        "Gender": "2"
    }
] 
Run Code Online (Sandbox Code Playgroud)

是否可以substr(.Start_Date,1,5)"-"substr(.Start_Date,6,2)"-"substr(.Start_Date,8,3)在 CSV 中将 like 与 awk一起使用?

也许我正盯着墙而错过了右边的门?

更新:感谢很多人,这就像一个魅力!

jq -r '.[].Start_Date |= "\(.[0:4])-\(.[4:6])-\(.[6:8])" | .[].Function_Start_Date |= "\(.[0:4])-\(.[4:6])-\(.[6:8])" | .[].Date_of_Birth|="\(.[0:4])-\(.[4:6])-\(.[6:8])"' employees.json > test.json
Run Code Online (Sandbox Code Playgroud)

ogu*_*ail 5

在 JQ 中,我们为此提供了字符串切片字符串插值语法。

$ jq '.[].Start_Date | "\(.[0:4])-\(.[4:6])-\(.[6:8])"' file
"1977-05-16"
"1977-05-16"
Run Code Online (Sandbox Code Playgroud)


Ini*_*ian 5

jq使用中还有正则表达式匹配函数capture,它会发出命名的捕获组,稍后可以将其连接起来-以形成您想要的日期字符串。

jq '.[].Start_Date | capture("(?<x>[0-9]{4})(?<y>[0-9]{2})(?<z>[0-9]{2})") | join("-")'
Run Code Online (Sandbox Code Playgroud)

这是假设,您的Start_Date字段至少有 8 个字符长,并且不会验证小于该长度的长度。