2013-02-28 2 views
2

Это выражение sed преобразует входную строку в двухстрочную строку вывода. Каждая из двух выходных линий состоит из подстрок с входа. Первая линия должна быть convered в верхнем регистре:Sed выражение, которое преобразует некоторые совпадения в верхний регистр

s:random_stuff\(choice1\|choice2\){\([^}]*\)}:\U\1\n\2: 

Цель состоит в том, чтобы преобразовать

random_stuff_choice1{This is a sentence that MAY contain AnyThing} 
random_stuff_choice2{This is another similar sentence} 

в

CHOICE1 
This is a sentence that MAY contain AnyThing 
CHOICE2 
This is another similar sentence 

У меня есть проблема в том, что \ U aplies на все следующие так что вторая строка также верхняя. Можно ли применить \ U только к первому совпадению?

ответ

1

Использование \E отменить \U:

s:random_stuff_\(choice1\|choice2\){\([^}]*\)}:\U\1\E\n\2: 
+0

Вы пропустили подчеркивание 'random_stuff_' –

+0

ну да, так я и сделал :) Я исправил это - спасибо. – starfry

3

С sed:

$ sed 's/.*\(choice[0-9]\+\){\([^}]*\)}/\U\1\n\E\2/' file 
CHOICE1 
This is a sentence that MAY contain AnyThing 
CHOICE2 
This is another similar sentence 

С awk:

$ awk -F'{|}' 'gsub(/.*_/,""){print toupper($1)"\n"$2}' file 
CHOICE1 
This is a sentence that MAY contain AnyThing 
CHOICE2 
This is another similar sentence 
Смежные вопросы