我试图实现一个简单的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 )'
答案 0 :(得分:3)
您的t2
和t3
的数字比您尝试匹配的示例多一位。此外,您需要引用参数,并删除这些空格:
#!/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" "$@"
sh
代替bash
,因为我们没有使用标准POSIX shell中没有的任何Bash功能(例如dash
)。t
,t1
和t2
的定义,以及要替换它们的双引号。grep
通过-E
标志了解扩展正则表达式,并且我已将该模式作为参数-e
(&# 34;表达式")标记为grep
。grep
进程exec
代替shell,因为没有理由为它做分叉。"$@"
,因此您可以为grep
提供额外选项(例如-w
,-n
或{{1例如,并选择是否向脚本提供文件或流stdin。另请注意,如果您愿意接受混合的-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}' "$@"