如何编写单行sed命令来打印从行开头开始的SSN,后跟空格

时间:2017-03-07 21:15:30

标签: sed

所以我试图让只有SSN开始行。 以下是样本数据的样子。

111-11-1111 dfsfdsfsdfafdfsfdsdsfsfdfsda
dsffdsdsfdfsf 222-22-2222 dfsfsdafasasdadas
 333-33-3333 dsfadfasdasdfa
444-44-4444 fdfdfsfdsfs
555-55-5555
dfsfdfdffffdsdfsfdsfsd 66-66-6666

所以只有1,4和5 SSN应该打印出来,没有别的。这在awk甚至是sed脚本中都很容易,但是我需要在一行sed命令中执行此操作(查看我错过了一个类的测试问题)。

我已经尝试过了。

sed 's/.*\(^[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]\).*/\1/'

给了我

111-11-1111
dsffdsdsfdfsf 222-22-2222 dfsfsdafasasdadas
 333-33-3333 dsfadfasdasdfa
444-44-4444
555-55-5555
dfsfdfdffffdsdfsfdsfsd

然而,我无法删除其余的行(2,3,6)。

1 个答案:

答案 0 :(得分:1)

无需sedgrep更善于提取简单数据:

grep -Eo '^[0-9]{3}-[0-9]{2}-[0-9]{4}( |$)'

然而,这包括一个尾随空间,可以通过使用PCRE的前瞻来避免:

grep -Po '^[0-9]{3}-[0-9]{2}-[0-9]{4}(?= |$)'

如果你真的想使用sed,以下内容应该适用于BSD和最近的GNU sed(在较旧的GNU sed中,使用-r代替{{1} }}):

-E

它使用sed -nE 's/^([0-9]{3}-[0-9]{3}-[0-9]{4})( |$).*/\1/p' 标志,以便默认情况下不打印行,并在替换结束时使用-n命令,以便打印匹配的行。

我必须使p(与字符串的末尾匹配)并替换空格以匹配第4行。