【问题标题】:Shell Scripting: RegEx in if StatementShell 脚本:if 语句中的正则表达式
【发布时间】:2013-05-10 16:46:30
【问题描述】:

我似乎无法弄清楚如何在 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 

这是我遇到问题的代码的 sn-p:

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

输出是:

坏了!

【问题讨论】:

  • 这么简单的事情你不需要正则表达式:[[ $line == End* ]]
  • 您的文件是否真的在每一行的开头包含&gt; 字符?
  • @glennjackman 我正在为那些有日期的人做正则表达式,但它不起作用,所以我在第一行做了它以确保没有出错。实际文件不包含“>”。

标签: regex shell if-statement


【解决方案1】:

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

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

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

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

【讨论】:

  • 请注意,这不能移植到所有 shell。
  • @datguy "=~" 有什么作用?
  • @dalawh =~ 告诉 bash 匹配正则表达式而不是文字字符串。
【解决方案2】:

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

while read -r line; do
    case $line in
        End*) ... your stuff here 
            ... more your stuff here
            ;;   # double semicolon closes branch
    esac
done

【讨论】:

  • @cnst 实际上,这应该可以一直移植到原始的 Bourne sh。 (不保证 csh,一些 *BSD 变体仍然 - 莫名其妙 - 似乎很珍惜。)
【解决方案3】:

您可以使用以下方法检查line是否以End开头

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

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

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

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

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

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

【讨论】:

  • 我认为 = 和 == 之间没有区别。有没有?还有,用一个[]和两个[]有什么区别?
  • if [ "$a" = "$b" ] -- 进行字符串比较,但 ==[[ ]] 可用于正则表达式搜索。请查看我在答案中给出的链接。希望能帮助到你。从那个链接复制——"The == comparison operator behaves differently within a double-brackets test than within single brackets."
  • 你能告诉我你的代码吗,它应该可以工作...我已经测试过了。
  • @dalawh 我有一个小错字。我更新了答案。请使用End* 看看是否可行。
  • [ 是基本的旧 Bourne sh 命令 test 不支持正则表达式。 [[ 变体是 Bash(和 ksh 等)扩展,具有改进的极端情况下的鲁棒性以及更多功能,包括 =~ 正则表达式匹配。正确的字符串相等运算符是 = 尽管 Bash 允许 == 作为别名。
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 2011-08-21
  • 2022-10-24
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多