逻辑或 | Unix

logical or | Unix

我正在尝试实现一个简单的 shell 程序来显示文件中包含的法语 phone 数字。

这是我的基础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  ( $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  ( $t | $t2 | $t3 )'

您的 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 的参数("expression") 标记为 grep.
  4. grep 进程 exec 代替了 shell,因为没有理由为此分叉。
  5. 我已经传递了完整的输入参数集 "$@" 因此您可以为 grep 提供额外的选项(例如 -w-n-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}' "$@"

如果您需要分隔符匹配,那么您可以为此使用捕获组:

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