如何在匹配之前grep第一个匹配项?
如何在匹配之前grep第一个匹配项?
我有一个文件,基本上我需要使用grep返回与特定值关联的“键”。
例如,如果我有:
[abc]
field1=34234
field2=t2342
[def]
field1=44354
field2=23423
我想能够grep,比如23423,然后基本上匹配[def]
并返回/打印括号内的内容(例如def
)。
文件的格式类似于这样,我想在grep的参数之前匹配包含[
和]
的第一行,如果这样说得通的话。
我找到了这个问题,类似的地方是,-B 1
会给你前一行,可以使用这个的某个变体来防止匹配前的一些行。
问题是我不能确定匹配和第一行带括号之间的确切行数,所以我想避免这样做,而是只匹配前面包含括号的第一行。
使用grep还是类似的bash实用程序可以实现这个吗?
在处理文本时,有时需要在匹配值之前获取第一个匹配值。下面是一种解决方法:
一种方法是使用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脚本中可以正常工作。
如果你能在问题中提供这些细节,那将更有帮助。