在下面的示例中,我需要重新调整第5行的第二组引号中的内容,最多不超过小数点。
引号的内容各不相同,因此必须捕获"
和.
之间的所有内容,并且不能使用基于两者之间任何内容的搜索字符串来匹配它们。
将来可能还会更改行号,但是始终可以通过搜索“项目”来找到该行。
由于专有环境/操作系统的限制,该过程应使用awk
,grep
,cat
,sed
或它们的组合。我已经搜索了一下,但找不到所需的任何东西。
文件名:data.json
{
"Brand": "Marketside",
"Price": "3.97",
"SKU": "48319448",
"Item": "12-ct_Large_Grade_A(Brown_Organic).48319448",
}
成功输出的示例为:
12-ct_Large_Grade_A(Brown_Organic)
答案 0 :(得分:1)
仅依赖于面向行的工具来操作JSON的要求似乎是错误的。在处理结构化格式时,请使用了解结构化格式的工具。
jq '.Item|split(".")[0]' data.json
提取第一个点;或
jq '.Item|sub("[.][^.]*$";"")' data.json
丢弃从最后一个点到字段结尾的文本。
(尽管{jq
不喜欢伪JSON中Item
之后的多余的最后一个逗号。)
毫无疑问,可以通过简单的Awk或sed
脚本解决您所说的急性问题 。然后发生的事情-在这里已经发生的事情-您发现其他要求,这些要求在您发布的玩具示例中并不明显。一个适当的可移植解决方案可以处理带有嵌入逗号和转义双引号的字符串的JSON样本,并且当表层JSON格式更改时,因为上游某处的组件已更新为将所有JSON放在一行或其他任何内容上,所以继续工作。>
答案 1 :(得分:0)
这是个可怕的事情
awk -F'.' '/Item/{split(substr($0,1,L=length($0)-length($NF)-1),a,"\"");print a[4]}'
12.ct.Large.Grade.A(Brown_Organic)
它搜索Item
,然后从"
打印到最新的.
用.
分割字符串
在分割length($NF)
后找到最新部分的长度
从总计中提取此长度,以查找最新.
length($0)-length($NF)
的位置
然后将第一部分除以"
并打印第四部分。