我有一些我想修复的损坏的JSON文件.问题是其中一个字段AcquisitionDateTime格式不正确:
{
"AcquisitionDateTime": 2016-04-28T17:09:39.515625,
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是将值包装在括号内.我可以用正则表达式轻松地做到这一点:
perl -pi -e 's/\"AcqDateTime\": (.*),/\"AcqDateTime\": \"\1\",/g' t.json
Run Code Online (Sandbox Code Playgroud)
现在,我想扩展正则表达式,以便在JSON没有被破坏的情况下,内容不会在""中被包装两次.我面临的问题是我不知道如何混合前瞻,if/then语句和捕获组.这是我的尝试:
Lookahead, if you find a ", then capture what is between it. Else capture everything.
perl -pi -e 's/\"AcqDateTime\": (?(?=\")\"(.*)\"|(.*)),/\"AcqDateTime:\" \"\1\",/g' t.json
Run Code Online (Sandbox Code Playgroud)
这是我有兴趣纠正的部分:
Lookahead for a \" -> if yes, then capture without it. \"(.*)\" Else capture all (.*)
(?(?=\")\"(.*)\"|(.*)),
Run Code Online (Sandbox Code Playgroud)
有人会向我解释我做错了什么吗?
提前致谢.
匹配时间戳的一个好的开始是
\S+
Run Code Online (Sandbox Code Playgroud)
但这也匹配逗号,所以我们切换到
[^\s,]+
Run Code Online (Sandbox Code Playgroud)
现在,您也想避免匹配引号。
[^\s",]+
Run Code Online (Sandbox Code Playgroud)
这就是你所需要的。
perl -i -pe's/"AcqDateTime":\s*+\K([^\s",]+)/"$1"/g' t.json
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |