使用 sed 获取引号内的字符串

使用 sed 获取引号内的字符串

我有一个包含如下文本的文件:

"id":1519539,"description":"xxxxxxxx","severity":"yyy","pasahelpdesk":null,"subSource":"","dateReception":{"timezone":{"name":"Europe\/France","timestamp":1549493320},"sg_datatables_editable":[
false,false,false,false,false,false,false,false,false,false,false]},{
"id":1519540,"description":"xxxxxxxx","severity":"yyy","pasahelpdesk":null,"subSource":"","dateReception":{"timezone":{"name":"Europe\/France","timestamp":1549493340},"sg_datatables_editable":[
false,false,false,false,false,false,false,false,false,false,false]},{

我正在尝试获取时间戳的值。我正在尝试:

sed "s/.*timestamp\":\(.*\).*$/\1/g"

但它给出了时间戳的值以及直到行尾的所有值:

1549493320},"sg_datatables_editable":[
false,false,false,false,false,false,false,false,false,false,false]},{
1549493340},"sg_datatables_editable":[
false,false,false,false,false,false,false,false,false,false,false]},{

我怎样才能获得:

1549493320
1549493340

答案1

awk你可以像这样进行采样

awk -F'[,:}]' '{print $16}' input_file

此外,如果您的文件是 JSON 格式,您可以使用jq

答案2

有两个问题:

  1. 你打印了不匹配的行
  2. 你匹配太多了

第一个问题可以通过使用-nand来解决p,第二个问题可以通过缩小匹配范围来解决,例如使用 ERE:

sed -nE 's/.*"timestamp":([0-9]+).*/\1/p'

相关内容