用字符串替换文件中的一行

时间:2013-07-22 14:36:44

标签: linux shell sed awk

我的文件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"}'

3 个答案:

答案 0 :(得分: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可以告诉我们它是否是一个有效的问题。

答案 1 :(得分:2)

首先,从您的name中提取$string部分为

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

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

sed -i "/\<$NAME\>/s/.*/$string/" file1

答案 2 :(得分:1)

像这样使用awk:

awk -v str="$string" -F '[,{}:]+' '{
  split(str, a);
  if (a[3] ~ $3)
     print str;
  else print
}' file.json