如何在匹配之前grep第一个匹配项?

12 浏览
0 Comments

如何在匹配之前grep第一个匹配项?

我有一个文件,基本上我需要使用grep返回与特定值关联的“键”。

例如,如果我有:

[abc]

field1=34234

field2=t2342

[def]

field1=44354

field2=23423

我想能够grep,比如23423,然后基本上匹配[def]并返回/打印括号内的内容(例如def)。

文件的格式类似于这样,我想在grep的参数之前匹配包含[]的第一行,如果这样说得通的话。

我找到了这个问题,类似的地方是,-B 1会给你前一行,可以使用这个的某个变体来防止匹配前的一些行。

问题是我不能确定匹配和第一行带括号之间的确切行数,所以我想避免这样做,而是只匹配前面包含括号的第一行。

使用grep还是类似的bash实用程序可以实现这个吗?

0
0 Comments

在处理文本时,有时需要在匹配值之前获取第一个匹配值。下面是一种解决方法:

一种方法是使用awk命令。使用该命令可以找到包含所需搜索值的段落,并获取第一个字段(不包含方括号[])。示例如下:

awk -v RS= '/23423/{gsub(/[][]/, "", $1); print $1}' file

其中,[][]表示匹配方括号[]

另一种方法是使用awk命令,获取包含所需搜索值的段落,并获取第一个字段(去除了方括号[])。示例如下:

awk -v RS= '/23423/{print substr($1, 2, length($1)-2)}' file

你可以在shell中运行以上命令,但在从外部应用程序调用时可能会出错。错误提示为:[Nov 27 19:15:52] WARNING[3105][C-00002091]: pbx_variables.c:721 pbx_substitute_variables_helper_full: Error in extension logic (missing '}') [Nov 27 19:15:52] WARNING[3105][C-00002091]: pbx_functions.c:462 func_args: Can't find trailing parenthesis for function 'SHELL(awk -v RS= '/text/{gsub(/[][]/, "", $1'?

如果你将SHELL输出保存到变量中,是否可以通过简化表达式来摆脱$1,以及是否可以简化表达式?移除print并不能解决问题。

在这里,你不能删除任何内容,需要根据你的应用程序进行适应。有时候,双重使用$可能会有帮助,例如$$1(在Makefile中的用法)。我不确定是否有GNU grep可以帮助,可以尝试使用以下命令:grep -Poz -m1 '\[\K[^][]+(?=](?:\R.+)*23423)' file

你可以在shell中尝试运行以上命令,但可能无法正常工作。关于演示的具体操作,我也不太清楚。

所以,你可能没有使用GNU grep。

如果在批处理脚本中使用awk命令,该如何工作?输入的23423是$1(一个参数),所以与awk语句中的$1发生了冲突。

实际上,这里并没有冲突,因为awk语句中的$1是在单引号内部。

我明白了,之前的问题已经解决了,awk命令在外部shell脚本中可以正常工作。

如果你能在问题中提供这些细节,那将更有帮助。

0