逻辑或 | 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 )'
您的 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
的参数("expression") 标记为 grep
.
grep
进程 exec
代替了 shell,因为没有理由为此分叉。
- 我已经传递了完整的输入参数集
"$@"
因此您可以为 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}' "$@"
我正在尝试实现一个简单的 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 )'
您的 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
的参数("expression") 标记为grep
. grep
进程exec
代替了 shell,因为没有理由为此分叉。- 我已经传递了完整的输入参数集
"$@"
因此您可以为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}' "$@"