将特定匹配项保存到变量中

时间:2019-04-20 19:14:45

标签: regex bash

我有一个包含以下示例的文件:

*
ABCD Z12,
$ (67,EAGL165XQ.58,AD=0.0001,SF=7.0,TC=EAGL165XQ.58,LY={70},DT={0},BX=0.0,BY=0.0,UX=240.0,UY=8000.0)
ROWS 41860/111496
*

我需要做的是将EAGL165XQ.58的第一次出现添加到变量中。我该如何使用正则表达式呢?

3 个答案:

答案 0 :(得分:0)

This RegEx可能会帮助您获取输入的第一个实例,该实例从左到右用限制:

,([A-Z0-9]+\.[0-9]{2})

您可以简单地使用$1对其进行调用。

enter image description here

答案 1 :(得分:0)

您可以使用sed进行此操作,但是必须使用0,addr2地址范围(请参见sed(1) - Linux manual page)将sed设置为位于其范围的末尾第一场比赛,例如

$ sed -n '0,/.*EAGL/s/^[^,]*[,]\(EAGL[^,]*\),.*$/\1/p' < file
EAGL165XQ.58

说明

  • 在常规替换0,addr2之前使用s/find/replace模式,其中
  • find使用
  • 查找第一个逗号[,],后跟EAGL
  • 捕获组\(...\),用于将匹配的EAGL...存储到以下逗号,以及其中
  • 后向引用\1用作replace,用\(...\)之间捕获的内容替换整行

要将结果捕获到变量中,可以使用命令替换,例如

$ myvar=$(sed -n '0,/.*EAGL/s/^[^,]*[,]\(EAGL[^,]*\),.*$/\1/p' < file)
$ echo $myvar
EAGL165XQ.58

仔细检查一下,如果还有其他问题,请告诉我。

答案 2 :(得分:0)

在gnu bash上尝试

 而IFS =',='读-r s
做
 [[$ s =〜EAGL165XQ \ .58]] && {var = $ {BASH_REMATCH}; break; }
完成<文件
 

在gnu sed上尝试

  var = $(sed -En's / [^,=] *。(EAGL165XQ.58)。* / \ 1 / p'文件)


回声$ var
EAGL165XQ.58