You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写Bash脚本实现TXT文件双条件匹配并输出对应行

问题描述

我有一个名为Search_this_file.txt的TXT文件,内容格式如下:

12:00:00 AM First_Name Last_Name
01:00:00 AM First_Name1 Last_Name2
...
01:00:00 PM First_Name13 Last_Name13
...
11:00:00 PM First_Name23 Last_Name23

需要编写Bash脚本逐行扫描该文件,仅输出匹配用户输入的HH:MM:SS格式时间和AM/PM标识的行。例如输入01:00:00和PM时,需输出对应行01:00:00 PM First_Name13 Last_Name13。

当前使用的脚本如下:

#!/bin/bash/

read -p "Enter time in HH:MM:SS format " TIME
read -p "AM or PM? " AMPM

echo -e | grep -Fiw '$TIME' Search_this_file.txt | 
grep -Fiw "$AMPM"
问题分析与修正

原脚本存在三处关键问题:

  1. Shebang行错误:#!/bin/bash/末尾多了斜杠,应改为#!/bin/bash
  2. 变量解析失败:第一个grep使用单引号'$TIME',单引号会阻止Bash解析变量,导致无法匹配用户输入的时间
  3. 冗余且易误匹配:echo -e |完全多余,两次grep拆分匹配逻辑,可能误匹配到文本中其他位置的AM/PM(比如姓名字段)

修正后的脚本(基础版)

#!/bin/bash

read -p "Enter time in HH:MM:SS format: " TIME
read -p "AM or PM?: " AMPM

# 按固定字符串匹配连续的时间+AM/PM字段,避免误匹配
grep -F "$TIME $AMPM" Search_this_file.txt

更严格的匹配版本(避免行内其他位置的误匹配)

如果需要确保匹配的是行首的时间和AM/PM字段,可以使用正则锚定行首:

#!/bin/bash

read -p "Enter time in HH:MM:SS format: " TIME
read -p "AM or PM?: " AMPM

# 用正则锚定行首,确保匹配的是开头的时间和AM/PM字段
grep -E "^$TIME $AMPM " Search_this_file.txt
关键说明
  • -F选项让grep按固定字符串匹配,不会将时间中的冒号当作正则特殊字符处理
  • 合并$TIME和$AMPM为一个匹配字符串,确保两者是连续的字段,避免拆分匹配带来的误判
  • 正则版本的^锚定行首,末尾的空格确保AM/PM后面是姓名字段,进一步提高匹配准确性

内容的提问来源于stack exchange,提问作者PRuss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:33:16