编写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"
问题分析与修正
原脚本存在三处关键问题:
- Shebang行错误:
#!/bin/bash/末尾多了斜杠,应改为#!/bin/bash - 变量解析失败:第一个
grep使用单引号'$TIME',单引号会阻止Bash解析变量,导致无法匹配用户输入的时间 - 冗余且易误匹配:
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
相关产品推荐
相关产品推荐

