在我的 bash 脚本中,我有一个变量,我试图将其传递给模式以使用 awk 进行搜索。然而我期望发生的事情并没有发生。我有以下文本文件(text.txt):
-----------
Task: a
(some info)
....
------------
Task: b
(some info)
....
------------
Task: c
(some info)
....
------------
我的脚本有以下内容:
letter=a
awk -v var="$letter" '/Task .* \var/' RS='-+' text.txt
然而,当我这样做时,除了执行以下操作之外,我什么也得不到:
awk '/Task .* a/' RS='-+' text.txt
我得到了我所期望的:
Task: a
(some info)
....
笔记:我需要将它作为变量传递,因为我有一个不断更改变量的循环,这就是我想要寻找的。我宁愿使用 awk,因为这是我最熟悉的,但我不反对听到其他建议,例如 sed 或 grep。
答案1
您可以将整个模式传递给 awk
letter=a
awk -v pattern="Task .* $letter" -v RS='-+' '
$0 ~ pattern
' text.txt
或在 awk 中将模式构造为字符串
letter=a
awk -v ltr="$letter" -v RS='-+' '
BEGIN {pattern = "Task .* " ltr}
$0 ~ pattern
' text.txt
由于 awk 变量没有前缀$
,因此您不能将它们嵌入到 a 中/regex constant/
- 它只是其中的文本。
(我倾向于将所有 awk 变量放在前面-v
)
答案2
您最好的选择可能是通过环境传递变量:
letter=a
p="Task: *$letter" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file
或者:
p="Task: *a" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file
使用-v var=value
,awk
将扩展转义序列的值。如果你想awk
从 shell 中按原样传递数据,-v var="$shell_var"
这是不可靠的。
使用ENVIRON
(或ARGV
) 更可靠,因为 whenawk
不会扩展其中的转义序列。