9

我似乎无法弄清楚如何在if语句中正确编写正则表达式。我希望它打印出所有带有“结束日期”的行。

NUMBERS 包含具有以下内容的文本文件:

End Date    ABC ABC ABC ABC ABC ABC
05/15/13    2   7   1   1   4   5  
04/16/13    4   3   0   1   3   6  
03/17/13    6   9   3   8   5   9  
02/18/13    8   2   7   1   0   1  
01/19/13    1   9   2   2   5   2  
12/20/12    7   2   7   1   0   1 

这是我遇到问题的代码片段:

if [ -f $NUMBERS ]
then
        while read line
        do
                if [ $line = ^End ]
                then
                        echo "$line"
                else
                        echo "BROKEN!"
                        break                   
                fi
        done < $NUMBERS
else
        echo "===== $NUMBERS failed to read  ====="
fi

输出是:

破碎的!

4

3 回答 3

14

如果您使用的是 bash,请尝试=~

...
if [[ $line =~ ^End ]]

请注意,以下内容将不起作用:1

if [[ "$line" =~ "^End" ]]
于 2013-05-15T23:22:22.153 回答
3

便携式解决方案是使用case支持通配符(glob 通配符;不是实际的正则表达式)的盒子。语法有点怪,但你习惯了。

while read -r line; do
    case $line in
        End*) ... your stuff here 
            ... more your stuff here
            ;;   # double semicolon closes branch
    esac
done
于 2013-05-16T03:43:01.033 回答
-1

您可以使用以下内容检查是否lineEnd

if [[ "$line" == End* ]]

如果要使用正则表达式,可以使用以下内容。

if [[ "$line" =~ ^End* ]]

http://tldp.org/LDP/abs/html/comparison-ops.html

另请注意,建议始终引用您的变量。

http://tldp.org/LDP/abs/html/quotingvar.html

于 2013-05-15T23:27:08.713 回答