读取文本文件中带有特殊字符的行,特别是在bashshell中引用“”

读取文本文件中带有特殊字符的行,特别是在bashshell中引用“”,bash,shell,if-statement,scripting,special-characters,Bash,Shell,If Statement,Scripting,Special Characters,我有一个文本文件,它是两个灰色文件的输出差异。文本文件有如下行,我需要通过文本文件中的行读取文件循环,并基于文本到do something的左侧 编辑以添加详细信息: 左侧为 如果是这两个文件中的任何一个,我都需要将内容存储到一个变量中,并获取1stABCDEF 3rd10,搜索将在另外两个文件中的一个文件中搜索它们,如果找到,则打印一条消息并将这些文件名附加到电子邮件DL中。所有文件名和目录都存储在单独的变量中。 我该怎么做呢 ps:具备文本格式和bash/shell命令的基本知识,但仍在学习

我有一个文本文件,它是两个灰色文件的输出差异。文本文件有如下行,我需要通过文本文件中的行读取文件循环,并基于文本到do something的左侧

编辑以添加详细信息:

左侧为<或右侧为> 如果是这两个文件中的任何一个,我都需要将内容存储到一个变量中,并获取1stABCDEF 3rd10,搜索将在另外两个文件中的一个文件中搜索它们,如果找到,则打印一条消息并将这些文件名附加到电子邮件DL中。所有文件名和目录都存储在单独的变量中。 我该怎么做呢

ps:具备文本格式和bash/shell命令的基本知识,但仍在学习脚本语法。谢谢

ABCDEF,20200101,10                   <
PQRSTU,20200106,11                   <
LMNOPQ,20200101,12                   <
EFGHIJ,20200102,13                   <
KLMNOP,20200103,14                   <
STUVWX,20200104,15                   <
PQRSTU,20200105,16                   <
                                     > LMNOPQ,20200101,10
ABCDEF,20200107,17                   <
我现在做错了什么

while IFS= read -r line; do
if $line =~ ([^[:blank:]]+)[[:blank:]]+\< 
    then
    IFS=, read -r f1 f2 f3 <<< "${BASH_REMATCH[1]}"
        #echo "f1=$f1 f2=$f2 f3=$f3"
zgrep "$f1" file1 | grep "with seq $f3" || zgrep "$f1" file2 | grep "with seq $f3"
elif $line =~ \>[[:blank:]]+([^[:blank:]]+)
    then
    IFS=, read -r g1 g2 g3 <<< "${BASH_REMATCH[1]}"
        #echo "g1=$g1 g2=$g2 g3=$g3"
zgrep "$g1" file3 | grep "with seq $g3" || zgrep "$g1" file3 | grep "with seq $g3"        
fi

请您尝试一下:

#!/bin/bash

while IFS= read -r line; do
    if [[ $line =~ ([^[:blank:]]+)[[:blank:]]+\< || $line =~ \>[[:blank:]]+([^[:blank:]]+) ]]; then
        IFS=, read -r f1 f2 f3 <<< "${BASH_REMATCH[1]}"
        echo "f1=$f1 f2=$f2 f3=$f3"
        # do something here with "$f1", "$f2" and "$f3"
    fi
done < file.txt
请将echo f1=$f1 f2=$f2 f3=$f3行修改为所需的值 命令,例如grep

正则表达式[^[:blank:]+[[:blank:]+\。
语句IFS=,read-r f1 f2 f3 thanking@tshiono肯定很有帮助,从您那里学到了正则表达式的用法。肯定会奖励你的。将完成我的解决方案并返回。只是在我的例子中,需要处理您在单独的“if条件”中建议的两个正则表达式。让我算出我的信。再次感谢。感谢您的及时反馈。很高兴知道它有效。如果您有任何问题或其他要求,请随时问我。BR.添加了我的进一步评论…@tshiooba根据我在两个文件中的zgrep输出,我应该能够打印一些东西并发送带有文件附件的电子邮件通知。1您需要将正则表达式测试随附[[和]]。2缺少与第一行中do对应的done语句。请看我的最新答案,其中包括这些更正。至于邮件功能,你可以参考一些网站,例如。
f1=ABCDEF f2=20200101 f3=10
f1=PQRSTU f2=20200106 f3=11
f1=LMNOPQ f2=20200101 f3=12
f1=EFGHIJ f2=20200102 f3=13
f1=KLMNOP f2=20200103 f3=14
f1=STUVWX f2=20200104 f3=15
f1=PQRSTU f2=20200105 f3=16
f1=LMNOPQ f2=20200101 f3=10
f1=ABCDEF f2=20200107 f3=17
while IFS= read -r line; do
    if [[ $line =~ ([^[:blank:]]+)[[:blank:]]+\< ]]; then
        IFS=, read -r f1 f2 f3 <<< "${BASH_REMATCH[1]}"
        # echo "f1=$f1 f2=$f2 f3=$f3"
        result=$(zgrep "$f1" file1 | grep "with seq $f3" || zgrep "$f1" file2 | grep "with seq $f3")
    elif [[ $line =~ \>[[:blank:]]+([^[:blank:]]+) ]]; then
        IFS=, read -r g1 g2 g3 <<< "${BASH_REMATCH[1]}"
        # echo "g1=$g1 g2=$g2 g3=$g3"
        result=$(zgrep "$g1" file3 | grep "with seq $g3" || zgrep "$g1" file3 | grep "with seq $g3")
    fi
    if [[ -n $result ]]; then
        echo "result = $result"
    fi
done < file.txt