在下面的示例中,我需要重新调整第5 行第2 组引号内的内容,最多但不超出小数点。
引号的内容各不相同,因此必须捕获"
到.
之间的所有内容,并且不能使用基于两者之间任何内容的搜索字符串进行匹配。
将来行号也可能会更改,但是,始终可以通过搜索"项目"找到该行。
由于专有环境/操作系统的限制,该过程应该利用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)
完全依赖面向行的工具来操作JSON的要求似乎非常误导。操作结构化格式时,请使用了解结构化格式的工具。
jq '.Item|split(".")[0]' data.json
提取到第一个点;或
jq '.Item|sub("[.][^.]*$";"")' data.json
以放弃从最后一个点到字段末尾的文本。
(不过,jq
不喜欢伪 JSON 中Item
后面多余的最后一个逗号。
毫无疑问,任何人都认为,您所说的尖锐问题可以通过简单的 Awk 或sed
脚本来解决。然后发生的事情 - 这里已经发生的事情 - 是你发现了额外的要求,这些要求在你发布的玩具示例中并不明显。一个适当的、可移植的解决方案可以处理带有嵌入逗号和转义双引号的字符串的 JSON 示例,并在表面 JSON 格式发生变化时继续工作,因为上游某处的组件被更新为将所有 JSON 放在一行或其他任何内容上。
这是一个尴尬:
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)
的位置 然后将第一部分拆分"
并打印第四部分。