【发布时间】:2020-10-16 14:06:40
【问题描述】:
大家早上好!
我在 file.txt 中有以下几行:
big bird|Big birds tend to be big.;;They have wings.
big truck|I love big trucks!;;Ford makes nice big trucks.
red truck|Red is my favorite color.;;Red is also a name.
我的两个分隔符是竖线 (|) 和双分号 (;;)。我的脚本接受一个输入,将其与管道 (|) 之前的 file.txt 中的一行匹配,并在由 (;;) 分隔的管道之后随机返回相应的输出。
read -p " " query
response="$(awk -F\| -v r="$query" '$1==r{print $2;exit}' file.txt | sed 's/;;/\n/g' | shuf -n1)"
echo "$response"
例子:
Input: big truck
Output: Ford makes nice big trucks.
但这不起作用,除非输入完全匹配。如何修改 awk 表达式以允许它接受部分匹配或在两个单词倒置的情况下? (例如“大卡车”而不是“大卡车”
匹配“大”和“卡车”并从线路返回随机输出的期望行为:
Input: some trucks are big
Output: Ford makes nice big trucks.
提前非常感谢!
【问题讨论】:
-
对于部分匹配,您可以使用
$1 ~ r(但是您必须小心\字符)...匹配单词的不同组合将取决于您是否需要通用解决方案或者是否你有固定数量的术语,例如,如果它总是由空格分隔的一两个单词,或者可能有类似big green australian sub-urban mammal或其他的东西 -
当输入为
big bird truck,甚至big red bird truck时会发生什么? -
@Sundeep 5 或 6 个字将是它的范围。输入不会比这大得多。您能否详细说明如何在上面的代码库中使用 $1 ~ r 以及您提到的 \ 字符?为了安全起见,是否需要逃脱某些东西?如何逃脱?谢谢。
-
@Luuk 这种情况即使不是永远也不会发生。在这种情况下,它应该返回第一个匹配的行。非常感谢你提出来。很重要的一点。