2017-02-01 2 views
1

Für die Eingabe:Was ist los mit diesem Sed?

ADAMS, Andrew 1234 
BAYES, Ryan 9292 

Innen people.txt, habe ich:

cat people.txt | sed 's/\([A-Z]+\),[[:space:]]+\([A-Z]\)\([a-z]+\).*/(\2) \2\3 \1/' 

Und um zu erwarten:

(A) Andrew ADAMS 
(R) Ryan BAYES 

Aber stattdessen es gedruckt wieder die Eingabe. Was ist los mit dir?

+2

'\ +' nicht '+'. Oder verwenden Sie erweiterte reguläre Ausdrücke, 'sed -e'. – AlexP

+0

Omg. Vielen Dank...! –

+0

Und wenn Sie wirklich '(A)' und '(B)' möchten, sind Ihre Gruppen falsch. – Faibbus

Antwort

0
awk -F '[,[:blank:]]+' '{printf("(%s) %s %s\n", substr($2,1,1), $2, $1}' people.txt 

# alternative sed 
sed 's/\([^[:blank:]]*\),[[:blank:]]*\(\(.\)[^[:blank:]]*\).*/(\3\) \2 \1/' people.txt 

cat | sed ist nicht für sed benötigt (vielleicht ist es nur für die Proben Zweck in diesem OP)

0

Wie wäre es

sed 's/\(^.\)\([a-z]*\),\s*\([a-z]*\)\(.*$\)/(\1) \3 \1\2/gi' temp 

die i am Ende ermöglicht es Ihnen, Groß- und Kleinschreibung

zu ignorieren

Mit einem Sternchen ist das kürzere Äquivalent von Backslash +

mit Backslash s ist kürzer äquivalent für [[: Leerzeichen:]]

Es entfernt auch die unnötige Verwendung des Cat-Befehls.