逻辑或| Unix的

时间:2015-11-16 15:57:10

标签: bash unix grep logical-operators

我试图实现一个简单的shell程序,显示文件中包含的法语电话号码。

这是我的基本shell

#!/bin/bash

#search of phone numbers

t=( \+ | 00 )33[1-9][0-9]{8}
t2=( \+ | 00 )33[1-9][0-9]-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}
t3=( \+ | 00 )33[1-9][0-9].[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}

grep -e $1 ( $t | $t2 | $t3 )

这是我的输入文件:

phone_number.txt

+33143730862

00335.45.45.45.45

+332-45-45-45-45

+334545454554454545

我一直收到这个错误:

./script_exo2.sh: line 5: syntax error near unexpected token `|'
./script_exo2.sh: line 5: `t=( \+ | 00 )33[1-9][0-9]{8}'
./script_exo2.sh: line 6: syntax error near unexpected token `|'
./script_exo2.sh: line 6: `t2=( \+ | 00 )33[1-9][0-9]-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}'
./script_exo2.sh: line 7: syntax error near unexpected token `|'
./script_exo2.sh: line 7: `t3=( \+ | 00 )33[1-9][0-9].[0-9]{2}.[0-9]{2}.[0-9]{2}.[0-9]{2}'
./script_exo2.sh: line 9: syntax error near unexpected token `('
./script_exo2.sh: line 9: `grep -e $1 ( $t | $t2 | $t3 )'

1 个答案:

答案 0 :(得分:3)

您的t2t3的数字比您尝试匹配的示例多一位。此外,您需要引用参数,并删除这些空格:

#!/bin/sh
t='(\+|00)33[1-9][0-9]{8}'
t2='(\+|00)33[1-9]-[0-9]{2}-[0-9]{2}-[0-9]{2}-[0-9]{2}'
t3='(\+|00)33[1-9]\.[0-9]{2}\.[0-9]{2}\.[0-9]{2}\.[0-9]{2}'

exec grep -E -e "$t|$t2|$t3" "$@"
  1. 我使用sh代替bash,因为我们没有使用标准POSIX shell中没有的任何Bash功能(例如dash)。
  2. 我使用上面的单引号来说明tt1t2的定义,以及要替换它们的双引号。
  3. 我告诉grep通过-E标志了解扩展正则表达式,并且我已将该模式作为参数-e(&# 34;表达式")标记为grep
  4. grep进程exec代替shell,因为没有理由为它做分叉。
  5. 我已通过完整的输入参数"$@",因此您可以为grep提供额外选项(例如-w-n或{{1例如,并选择是否向脚本提供文件或流stdin。
  6. 另请注意,如果您愿意接受混合的-o.或任何分开的数字对,您可以将三个表达式简化为一个:

    -

    ,脚本变为

    (\+|00)33[1-9][0-9]([-.]?[0-9]{2}){4}
    

    如果您需要匹配分隔符,则可以使用捕获组:

    #!/bin/bash
    exec grep -E -e '(\+|00)33[1-9]([-.]?[0-9]{2}){4}' "$@"