1

我有一个file1包含以下内容的文件

{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

我想查找包含该单词的行clio5,然后将找到的行替换为以下字符串

string='{"name":"clio5", "value":"1568688554"}'
4

3 回答 3

3
$ string='{"name":"clio5", "value":"1568688554"}'
$ awk -F'"(:|, *)"' -v string="$string" 'BEGIN{split(string,s)} {print ($2==s[2]?string:$0)}' file
{"name":"clio5", "value":"1568688554"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

$ string='{"name":"citroen_c3", "value":"1568688554"}'
$ awk -F'"(:|, *)"' -v string="$string" 'BEGIN{split(string,s)} {print ($2==s[2]?string:$0)}' file
{"name":"clio5", "value":"13"}
{"name":"citroen_c4", "value":"23"}
{"name":"citroen_c3", "value":"1568688554"}
{"name":"golf4", "value":"16"}
{"name":"golf3", "value":"8"}

根据@dogbane 的评论更新了上述内容,因此即使文本包含"s 也能正常工作。如果文本可以包含":"(带有适当的转义),它仍然会失败,但这似乎不太可能,并且 OP 可以告诉我们它是否是一个有效的问题。

于 2013-07-22T14:48:12.583 回答
2

首先你从你的as 中提取name部分$string

NAME=`echo $string | sed 's/[^:]*:"\([^"]*\).*/\1/'`

然后,使用$NAME将字符串替换为

sed -i "/\<$NAME\>/s/.*/$string/" file1
于 2013-07-22T14:46:11.353 回答
1

像这样使用 awk:

awk -v str="$string" -F '[,{}:]+' '{
  split(str, a);
  if (a[3] ~ $3)
     print str;
  else print
}' file.json
于 2013-07-22T14:47:53.957 回答