Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bash script to print all valid phone numbers.
You may assume that a valid phone number must appear in one of the following two formats: (xxx) xxx-xxxx or xxx-xxx-xxxx. (x means a digit)
You may also assume each line in the text file must not contain leading or trailing white spaces.
For example, assume that file.txt has the following content:
987-123-4567
123 456 7890
(123) 456-7890
Your script should output the following valid phone numbers: 987-123-4567
(123) 456-7890
重点是命令+正则表达式
1. egrep用正则表达式选择含有符合要求的字符串的行
egrep '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}\$' file.txt
其中,egrep等价于grep -e,支持扩展的正则表达式,因为这里用了(|)。
^,$分别用来确定字符串的开始和结尾;对于123-或者(123)空格,用(word1|word2)兼容,即
([0-9]{3}-|\([0-9]{3}\) )
;当然[0-9]可以用[[:digit:]] 代替
2. awk的使用正则,字符匹配
awk '/word/' file
,其中//中的就是正则表达的字符串
awk '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}\$/' file.txt #或
awk '/^([[:digit:]]{3}-|\([[:digit:]]{3}\) )[[:digit:]]{3}-[[:digit:]]{4}$/' file.txt
3. sed+正则匹配
sed -r: 表示支持正则表达; -n: 表示安静模式,只输出处理的那一行。
sed -n -r '/^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$/p' file.txt
其中,//中的是用正则表达式表示的字符串。