如何在模式匹配后提取单词

如何在模式匹配后提取单词

输入.txt

abc1 abc2 {"request":{"jjj":"opt1"},"user":{"name":"abc5"}}
xyz1 xyz2 {"request":{"xyz3":{"xyz4":{"xyz5":"xyz6"}},"jjj":"opt2"}}
ghi1 ghi2 {"request":{"ghi3":{"ghi4":{"ghi5":"ghi6"}},"jjj":"opt3"},"user":{"ghi7":"value"}}

需要输出如前两个字段和匹配字符串后的单词jjj

abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3

答案1

如果您能够使用sed,则可以使用正则表达式从第三列中提取必要的部分,同时保持其余部分不变。

sed 's/{.*"jjj":"\([^"]*\).*$/\1/g' input.txt

我的input.txt文件包含:

abc1 abc2 {"abc3":{"jjj":"opt1"}}
xyz1 xyz2 {"xyz3":{"jjj":"opt2"}}
aaa1 aaa2 {"aaa3":{"aaa4:"jjkk"},.....{"jjj":"opt3"}}

在这里,我试图捕获下"jjj":"一个结束双引号前后双引号中存在的值。

答案2

$ awk '
{
  print $1, $2, \
   substr($0, 8+match($0, /\{"jjj":"[^"]+"/), RLENGTH-9)
}' input.txt
abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3

答案3

由于您的第三个字段似乎是有效的 JSON,因此您可以考虑使用以下命令jq

$ awk -v cmd='jq -r ".. | .jjj? // empty"' '
  {printf "%s%s%s%s",$1,OFS,$2,OFS; print $3 | cmd; close(cmd)}
' file
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3

答案4

假设文件的三个字段都是制表符分隔的:

$ cut -f 3 file | jq -r '.request.jjj' | paste <( cut -f -2 file ) -
abc1    abc2    opt1
xyz1    xyz2    opt2
ghi1    ghi2    opt3

这会提取每行第三个字段中的 JSON 结构,并将它们传递给以jq提取每个字段中键的值.request.jjj。然后使用 将该数据粘贴回第三列paste

如果数据由单个空格字符分隔:

$ cut -d ' ' -f 3- file | jq -r '.request.jjj' | paste -d ' ' <( cut -d ' ' -f -2 file ) -
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3

cut请注意,需要使用第一个提取 JSON 结构的方法-f 3-,而不仅仅是-f 3确保没有嵌入的空格字符会截断数据。

相关内容