所以我试图让只有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)。
答案 0 :(得分:1)
无需sed
,grep
更善于提取简单数据:
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行。