Regex 提取单词并将其放在一行的开头
我有这样的json:Regex 提取单词并将其放在一行的开头,regex,linux,awk,sed,Regex,Linux,Awk,Sed,我有这样的json: {"time_stamp":1397718404043,"request_id":"123456"} 我想提取请求id并将其放在一行的开头。例如: 123456 {"time_stamp":1397718404043,"request_id":"123456"} 我可以用sed或其他unix工具来完成吗?如何使用?您可以使用jq echo '{"time_stamp":1397718404043,"request_id":"123456"}'|./jq ".reques
{"time_stamp":1397718404043,"request_id":"123456"}
我想提取请求id并将其放在一行的开头。例如:
123456 {"time_stamp":1397718404043,"request_id":"123456"}
我可以用sed或其他unix工具来完成吗?如何使用?您可以使用
jq
echo '{"time_stamp":1397718404043,"request_id":"123456"}'|./jq ".request_id"
输出为:
"123456"
见本页:
更新:
k='{"time_stamp":1397718404043,"request_id":"123456"}'
printf "%s %s\n" $(echo $k|./jq ".request_id"|tr -d \") $k
您可以使用
jq
echo '{"time_stamp":1397718404043,"request_id":"123456"}'|./jq ".request_id"
输出为:
"123456"
见本页:
更新:
k='{"time_stamp":1397718404043,"request_id":"123456"}'
printf "%s %s\n" $(echo $k|./jq ".request_id"|tr -d \") $k
使用awk(不是专用的json解析器):
s='{“时间戳”:1397718404043,“请求id”:“123456”}
awk-F''request_id*:*“'{p=$0;sub(/“*$/,”,$2);使用awk打印$2,p}'(不是专用的json解析器):
s='{“时间戳”:1397718404043,“请求id”:“123456”}
awk-F''request_id*:*“'{p=$0;sub(/“*$/,”,$2);print$2,p}'这将从发布的示例输入中生成发布的所需输出:
$ sed 's/\(.*"\([^"]*\)".*\)/\2 \1/' file
123456 {"time_stamp":1397718404043,"request_id":"123456"}
如果您的实际输入并不总是遵循您发布的格式,请使用更多信息和其他示例更新您的问题。这将根据您发布的示例输入生成您发布的所需输出:
$ sed 's/\(.*"\([^"]*\)".*\)/\2 \1/' file
123456 {"time_stamp":1397718404043,"request_id":"123456"}
如果您的实际输入并不总是遵循您发布的格式,请使用更多信息和其他示例更新您的问题。只需简单提取:
awk -F\" '{print $(NF-1),$0}'
或者只是:
awk -F\" '$0=$(NF-1)OFS$0'
只是一个简单的摘录:
awk -F\" '{print $(NF-1),$0}'
或者只是:
awk -F\" '$0=$(NF-1)OFS$0'
另一个使用perl的解决方案:
s='{"time_stamp":1397718404043,"request_id":"123456"}'
echo $s | perl -pe 'print /(\d+)"}/ , " "'
123456 {"time_stamp":1397718404043,"request_id":"123456"}
另一个使用perl的解决方案:
s='{"time_stamp":1397718404043,"request_id":"123456"}'
echo $s | perl -pe 'print /(\d+)"}/ , " "'
123456 {"time_stamp":1397718404043,"request_id":"123456"}
狂欢节:
狂欢节:
jq的-r
标志告诉它吐出“原始”输出,我相信应该为您删除这些引号。jq不是一个常用的工具,而是在JSON数据上使用JSON解析器的+1。jq的-r
标志告诉它吐出“原始”输出,我相信应该为您删除这些引号。jq不是一个常用的工具,但是+1用于对JSON数据使用JSON解析器。它很有效,非常感谢。但我不知道如何在请求id(123456)之后将输出中的空间更改为其他内容。我试过这样做:打印$2,“其他东西”p,但空间仍然存在。你能帮忙吗?所以你不需要这样的空格:123456{“time_stamp”:1397718404043,“request_id”:“123456”}
是你的预期输出吗?我应该使用tab而不是space来使用tab而不是space来使用空格:awk-F'.request_id*:*“{p=$0;sub(/“*$/,”“,$2);print$2,p}”'OFS='\t'或者如果您在问题中提供了预期的结果,我可能会更好地理解它。它很有效,非常感谢。但我不知道如何在请求id(123456)之后将输出中的空间更改为其他内容。我试过这样做:打印$2,“其他东西”p,但空间仍然存在。你能帮忙吗?所以你不需要这样的空格:123456{“time_stamp”:1397718404043,“request_id”:“123456”}
是你的预期输出吗?我应该使用tab而不是space来使用tab而不是space来使用空格:awk-F'.request_id*:*“{p=$0;sub(/“*$/,”“,$2);print$2,p}”'OFS='\t'或者,如果您在问题中提供了预期的输出,我可能会更好地理解它。我修改了您的解决方案,以便在他的评论中包含请求OP,并使其更具可读性。如果你觉得我修改的太多了,请随时回复+1表示perl
选项<代码>:)
我对你修改过的答案做了一点修改,我相信现在它更具可读性,看起来更像原来的答案:)我修改了你的解决方案,在他的评论中加入了一个请求OP,使其更具可读性。如果你觉得我修改的太多了,请随时回复+1表示perl
选项<代码>:)
我对你修改过的答案做了一点修改,我相信现在它更具可读性,看起来更像原来的答案:)嗨,埃德,对不起,你介意详细说明你的答案吗?我真的很难弄清楚为什么第二个捕获组会选择123456第一个捕获组就是整条线,第二个\([^“]*\)
是行中最后一个双引号和最后一个双引号之间的零个或多个非双引号字符序列,因为表达式的其余部分*“RE”。*
明确要求存在两个双引号,并且第一个*
匹配所有内容(包括双引号)最多一个双引号(贪婪匹配)。好的,我知道了,非常感谢你解释Ed。我在想第一个。*”匹配第一个{仅此而已。谢谢。嗨,埃德,对不起,请你详细说明你的答案好吗?我真的很难弄清楚为什么第二个捕获组要拾取123456。第一个捕获组是整条线,第二个\([^“]*\)
是行中最后一个双引号和最后一个双引号之间的零个或多个非双引号字符序列,因为表达式的其余部分*“RE”。*
明确要求存在两个双引号,并且第一个*
匹配所有内容(包括双引号)最多一个双引号(贪婪匹配)。对,我知道了,非常感谢你解释Ed。我想第一个。*”匹配第一个{only。谢谢。