Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux BASH-file.txt中带有多个分隔符的正则表达式匹配行_Linux_Bash_Awk - Fatal编程技术网

Linux BASH-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中的一个关键字,并基于该匹配返回一个随机分隔的响应。我可以匹配关键字并返回一个响应,但我无法思考如何将一些可能的响应随机化

例如,我在
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
分隔),然后选择一个(类似的)随机行,如so
sort-R输入| head-n1
作为一个迷你数据库本身——您可以打开任何文件并添加/删除您认为合适的行。但这是一个聊天脚本,file.txt中可能有数千行。为每个预期输入创建一个文件是不切实际的。需要找到一种方法在一个大的文本文件中逐行处理这个问题。我目前正在寻找@KamilCuk的建议,并试图找到一种方法来做到这一点。sed的手册页令人费解,但我可能会弄明白。用
big bird
过滤线路。2.替换
带有带有
sed
的换行符。3.用
shuf
选择随机行。我可能会有不同的想法——简单得多——我会给一个文件命名
bigbird
——使用输入来抓取
bigbird
——打开它,抓取一个随机行(用硬中断
\r\n
分隔),然后选择一个(类似的)随机行,如so
sort-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