如何编写单行sed命令以打印从行首开始并后跟空格的SSN
因此,我试图得到唯一的SSN,开始生产线。 下面是示例数据的样子如何编写单行sed命令以打印从行首开始并后跟空格的SSN,sed,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应该打印出来,其他什么都不打印。这在a
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) 无需使用
sed
,grep
更适合提取简单数据:
grep -Eo '^[0-9]{3}-[0-9]{2}-[0-9]{4}( |$)'
但是,这包括一个尾随空间,可通过使用PCRE的lookaheads来避免:
grep -Po '^[0-9]{3}-[0-9]{2}-[0-9]{4}(?= |$)'
如果您确实想使用sed
,以下内容应适用于BSD和最近的GNUsed
(在较旧的GNUsed
中,使用-r
而不是-E
):
它使用-n
标志,以便在默认情况下不打印行,并在替换结束时使用p
命令,以便打印匹配的行
我必须做
$
(匹配字符串的结尾)并替换空格以匹配第四行。我想你应该写3
,2
,4
@Kent确实,谢谢你。还将字符串的结尾作为空格的替代
sed -nE 's/^([0-9]{3}-[0-9]{3}-[0-9]{4})( |$).*/\1/p'