Linux BASH-file.txt中带有多个分隔符的正则表达式匹配行
大家早上好 我试图让我的脚本读取用户输入,匹配file.txt中的一个关键字,并基于该匹配返回一个随机分隔的响应。我可以匹配关键字并返回一个响应,但我无法思考如何将一些可能的响应随机化 例如,我在Linux BASH-file.txt中带有多个分隔符的正则表达式匹配行,linux,bash,awk,Linux,Bash,Awk,大家早上好 我试图让我的脚本读取用户输入,匹配file.txt中的一个关键字,并基于该匹配返回一个随机分隔的响应。我可以匹配关键字并返回一个响应,但我无法思考如何将一些可能的响应随机化 例如,我在file.txt中有: big bird|Big birds tend to be big.;;They have wings. big truck|I love trucks!;;Ford makes nice big trucks. red truck|Red is my favorite col
file.txt中有:
big bird|Big birds tend to be big.;;They have wings.
big truck|I love trucks!;;Ford makes nice big trucks.
red truck|Red is my favorite color.;;Red is also a name.
下面是我的代码,它可以很好地处理第一个分隔符(|),并在它之后返回整个响应
read -p " " query
response="$(awk -F\| -v r="$query" '$1==r{print $2;exit}' file.txt)"
echo "$query"
例如:
输入:大鸟
输出:大鸟往往是大的。;;它们有翅膀
但是我需要让它再次返回一个随机响应,该响应用双分号(;
)分隔在同一行上
因此,当输入该输入时,它应该随机返回“大鸟往往是大的。”或“它们有翅膀。”而不是同时返回两者
知道怎么做吗?试试:
awk -F\| -v r="$query" '$1==r{print $2;exit}' file.txt |
sed 's/;;/\n/g' | shuf -n1
尝试:
使用bash和GNU-sed:
或仅使用bash(不使用外部命令):
#/bin/bash
read-p“”查询
读行时;做
如果[[$line==$query\|*]];然后
line=${line#*|}
字段[0]=${line%;;;*}
字段[1]=${line#*;}
回显“${field[随机%2]}”
fi
完成
使用bash和GNU-sed:
或仅使用bash(不使用外部命令):
#/bin/bash
read-p“”查询
读行时;做
如果[[$line==$query\|*]];然后
line=${line#*|}
字段[0]=${line%;;;*}
字段[1]=${line#*;}
回显“${field[随机%2]}”
fi
完成
1。用big bird
过滤线路。2.替换代码>带有带有sed
的换行符。3.用shuf
选择随机行。我可能会有不同的想法——简单得多——我会给一个文件命名bigbird
——使用输入来抓取bigbird
——打开它,抓取一个随机行(用硬中断\r\n
分隔),然后选择一个(类似的)随机行,如sosort-R输入| head-n1
作为一个迷你数据库本身——您可以打开任何文件并添加/删除您认为合适的行。但这是一个聊天脚本,file.txt中可能有数千行。为每个预期输入创建一个文件是不切实际的。需要找到一种方法在一个大的文本文件中逐行处理这个问题。我目前正在寻找@KamilCuk的建议,并试图找到一种方法来做到这一点。sed的手册页令人费解,但我可能会弄明白。用big bird
过滤线路。2.替换代码>带有带有sed
的换行符。3.用shuf
选择随机行。我可能会有不同的想法——简单得多——我会给一个文件命名bigbird
——使用输入来抓取bigbird
——打开它,抓取一个随机行(用硬中断\r\n
分隔),然后选择一个(类似的)随机行,如sosort-R输入| head-n1
作为一个迷你数据库本身——您可以打开任何文件并添加/删除您认为合适的行。但这是一个聊天脚本,file.txt中可能有数千行。为每个预期输入创建一个文件是不切实际的。需要找到一种方法在一个大的文本文件中逐行处理这个问题。我目前正在寻找@KamilCuk的建议,并试图找到一种方法来做到这一点。sed的手册页非常混乱,但我可能会弄明白。这在@KamilCuk中运行得很好。非常感谢你!这在KamilCuk非常有效。非常感谢你!谢谢你花时间给我一个很棒的答案。完美的谢谢你花时间给我一个很棒的答案。完美的
#!/bin/bash
read -p " " query
sed -n "/^$query|/s/.*|\(.*\);;\(.*\)/\\$((RANDOM%2 + 1))/p" file.txt
#!/bin/bash
read -p " " query
while read line; do
if [[ $line == $query\|* ]]; then
line=${line#*|}
field[0]=${line%;;*}
field[1]=${line#*;;}
echo "${field[RANDOM%2]}"
fi
done < file.txt