2017-02-01 5 views
1

Для ввода:Что случилось с этим sed?

ADAMS, Andrew 1234 
BAYES, Ryan 9292 

Внутри people.txt, я использовал:

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

И ожидали получить:

(A) Andrew ADAMS 
(R) Ryan BAYES 

Но вместо этого, он снова напечатал вход. Что не так?

+2

'\ +' не '+'. Или используйте расширенные регулярные выражения 'sed -e'. – AlexP

+0

Omg. Благодаря...! –

+0

И если вы действительно хотите '(A)' и '(B)', ваши группы неверны. – Faibbus

ответ

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 не требуется для СЭД (может быть, это только для образца цели в этом ОП)

0

Как насчет

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

Использование I в конце позволяет игнорировать чувствительность к регистру

Использование звездочки - это более короткий эквивалент обратной косой черты +

с использованием обратной косой черты s более короткий эквивалент для [[: пробел:]]

Он также удаляет ненужное использование команды cat.