2017-03-07 1 views
0

So versuche ich, nur SSN, die die Linie zu starten. Hier sehen die Beispieldaten aus.Wie schreibe ich eine einzelne Zeile sed Befehl zum Ausdrucken SSN, die am Anfang der Zeile beginnen und werden von einem Leerzeichen gefolgt

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

Also nur die 1,4 und 5 SSN sollte gedruckt werden und nichts anderes. Dies wäre in awk oder sogar in einem sed-Skript einfach, aber ich muss es in einem einzeiligen sed-Befehl tun (Eine Testfrage überprüfen, die ich für eine Klasse verpasst habe).

Ich habe es versucht.

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

die mich

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

jedoch gibt kann ich nicht den Rest der Leitungen (2,3,6) gelöscht.

Antwort

1

Keine Notwendigkeit für sed, grep ist besser bei einfachen Extrahieren von Daten:

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

Dies ist jedoch ein Leerzeichen enthält, die durch die Verwendung von PCRE des Lookaheads vermieden werden könnte: Wenn

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

Sie möchten wirklich sed verwenden, sollte das folgende mit BSD und dem letzten GNU sed arbeiten (in älterem GNU sed, verwenden Sie -r anstelle von -E):

sed -nE 's/^([0-9]{3}-[0-9]{3}-[0-9]{4})(|$).*/\1/p' 

Es nutzt die -n Flags, so dass die Linien nicht standardmäßig, und den p Befehl am Ende der Substitution gedruckt werden, so dass angepasste Linien gedruckt werden.

Ich musste $ (die das Ende der Zeichenfolge übereinstimmt) und Alternative zu dem Leerzeichen, um die 4. Zeile übereinstimmen.

+0

Ich denke, Sie sollten '3',' 2', '4' – Kent

+0

@Kent tatsächlich schreiben, danke. Auch das Ende der Saite ist eine Alternative zum Raum – Aaron

Verwandte Themen