【问题标题】:BASH - Regex match line in file.txt with more than one delimiterBASH - file.txt 中的正则表达式匹配行具有多个分隔符
【发布时间】:2020-06-26 07:29:09
【问题描述】:

大家早上好!

我正在尝试让我的脚本读取用户输入,匹配 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"

所以,例如:

输入:大鸟

输出:大鸟往往很大。;;它们有翅膀。

但我需要让它再次返回一个用双分号 (;;) 在同一行分隔的随机响应。

因此,当输入该输入时,它应该随机返回“大鸟往往是大的”。 “他们有翅膀。”不能同时进行。

知道怎么做吗?

【问题讨论】:

  • 1.过滤线与big bird。 2. 将;; 替换为带有sed 的换行符。 3. 随机选择shuf的行。
  • 我可能会有不同的想法 -- 更简单 -- 我会命名一个 文件 big bird -- 使用输入抓取 big bird -- 打开它并抓取一条随机线(由硬中断\r\n 分隔)并选择一条(某种)随机线,如sort -R input | head -n 1。 -- 作为一个迷你数据库本身 -- 您可以打开任何文件并根据需要添加/删除行。
  • 有趣的想法扎克。但这是用于各种聊天脚本,file.txt 中可能有数千行。为每个预期的输入创建一个文件是不切实际的。需要找到一种方法在一个大文本文件中逐行处理此问题。我目前正在查看@KamilCuk 的建议并试图找到一种方法。 sed 的手册页令人困惑,但我可能会弄清楚。

标签: linux bash awk


【解决方案1】:

试试:

awk -F\| -v r="$query" '$1==r{print $2;exit}' file.txt |
sed 's/;;/\n/g' | shuf -n1

【讨论】:

  • 这很好用@KamilCuk。非常感谢!
【解决方案2】:

使用 bash 和 GNU sed

#!/bin/bash

read -p " " query
sed -n "/^$query|/s/.*|\(.*\);;\(.*\)/\\$((RANDOM%2 + 1))/p" file.txt

或仅使用 bash(不使用外部命令):

#!/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

【讨论】:

  • 感谢您抽出宝贵时间提供出色的答案。完美!
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多