2015-11-16 1 views
-3

Я пытаюсь реализовать простую программу оболочки, в которой отображаются французские телефонные номера, содержащиеся в файле.логический или | Unix

Вот моя основная оболочка

#!/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)' 
+10

Возможно, вы захотите поместить некоторые цитаты вокруг строк и переменных. http://www.shellcheck.net - ваш друг. – Biffen

+4

'bash' на OS X работает так же, как' bash' на любом Linux, который вы можете найти. Представленный вами сценарий недействителен ни для одного из них, потому что он использует метасимволы и управляющие операторы, некорректные, где он хочет, чтобы они обрабатывались как данные (в частности, '(', ')', '|' и символ пробела). –

+0

'00' не является универсальным международным префикс-кодом, хотя это во многих странах мира. Вот почему нам нужен универсальный '+'. – tripleee

ответ

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" "[email protected]" 
  1. я использовал sh вместо bash, так как мы не используем любую Bash возможности, которые недоступны в стандартном POSIX оболочках (например dash).
  2. Я использовал одинарные кавычки выше для определений t, t1 и t2 и двойных кавычек, где они должны быть заменены.
  3. Я сказал grep, чтобы понять расширенные регулярные выражения с помощью флага -E, и я поместил шаблон в качестве аргумента в флаг -e ("выражение") в grep.
  4. grep процесс exec s вместо оболочки, поскольку нет причин для его использования.
  5. Я прошел полный набор входных аргументов "[email protected]" так что вы можете дать дополнительные опции 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}' "[email protected]" 

Если вам нужны ограничители, чтобы соответствовать, то вы можете использовать захват группы для этого:

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

Большое спасибо за вашу помощь. –