3

我今天刚刚开始阅读有关正则表达式的信息,我有一个问题,如果我在下面尝试做的事情是可能的?

我有一个包含电话号码的文件,有些是 (xxx) xxx-xxxx 格式,但有些是 xxx-xxxx 格式。

例如电话簿:

(855) 422-6932
(899) 991-9054
(855) 912-7326
(833) 390-8072
934-2368
731-7056
251-5372
(855) 137-6285
(855) 294-5537
(844) 680-7479

所以目标是在所有不是 (xxx) xxx-xxxx 格式的行中添加 (000)。

到目前为止,我所做的基本上是对输出进行 grep 并将它们写入与正则表达式模式匹配的新文件中,然后进行另一个 grep 输出,但这次不匹配正则表达式并将其附加到同一个文件中;如下。

grep "([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\}" testfile > newtestfile ; grep -v "([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\}" testfile | sed 's/^/(000) /' >> newtestfile 

但这实际上会改变列表的顺序,因为新文件变为

(855) 422-6932
(899) 991-9054
(855) 912-7326
(833) 390-8072
(855) 137-6285
(855) 294-5537
(844) 680-7479
(000) 934-2368
(000) 731-7056
(000) 251-5372

有没有办法在不改变顺序的情况下做到这一点?我一直在研究使用 sed、awk 和 nl,但到目前为止还没有。我是菜鸟。。

谢谢你的帮助。

4

5 回答 5

3
$ sed 's/^[^(]/(000) &/' file
(855) 422-6932
(899) 991-9054
(855) 912-7326
(833) 390-8072
(000) 934-2368
(000) 731-7056
(000) 251-5372
(855) 137-6285
(855) 294-5537
(844) 680-7479
于 2013-08-31T11:26:32.743 回答
2

用 awk 真的很简单:

$ awk 'NF==1{$1="(000) " $1}1' file
(855) 422-6932
(899) 991-9054
(855) 912-7326
(833) 390-8072
(000) 934-2368
(000) 731-7056
(000) 251-5372
(855) 137-6285
(855) 294-5537
(844) 680-7479
于 2013-08-31T05:53:06.623 回答
2

使用 awk 的一些变化

awk '!/\(/ {$0="(000) "$0} 1'
于 2013-08-31T06:31:56.433 回答
1

有条件地失去grep并全力以赴sed

sed '/^([0-9][0-9][0-9])/! s/^/(000) /' testfile > newtestfile
于 2013-08-31T05:51:31.063 回答
1
perl -ne '@n = /\d+/g; unshift @n, "000" if @n==2; printf "(%s) %s-%s\n", @n'
于 2013-08-31T11:21:53.337 回答