2013-09-18 3 views
0

У меня есть строка:Замена нескольких символов с использованием СЭД

xy-uv>ab-cd-ed-ef-gh< 

мне нужно преобразовать его в:

xy-uv>ab cd ef gh< 

В принципе, мне нужно заменить - пробелом во всех символов между > и <.

Как это сделать, используя sed?

+1

Что вы пробовали? Это работает? Если нет, то какой (неправильный) результат? –

ответ

2

Один из способов сделать это:

sed 'h; s/.*>\(.*\)<.*/\1/; s/-/ /g; G; s/\(.*\)\n\(.*>\)\(.*\)\(<.*\)/\2\1\4/' 

В многострочного скрипта будет:

h 
s/.*>\(.*\)<.*/\1/ 
s/-/ /g 
G 
s/\(.*\)\n\(.*>\)\(.*\)\(<.*\)/\2\1\4/ 

Это общая закономерность, когда вы хотите сделать замену только для определенной части линии. Для этого используется трюм (h, G команд). В основном вы делаете копию строки (от шаблона ) в пространство для удержания. Затем выделите часть между '>' и '<' и замените '-' на ''. Затем используйте многострочную команду get G, чтобы добавить пространство удержания в пространство шаблона. Между ними будет новый символ линии (команда G - это многострочная команда). В последней строке мы просто перегруппируем две строки, используя группы и замещающие метасимволы \ N (где N - номер группы).

1

Вы можете попробовать этот sed скрипт:

s/>([^>]+)</\n>\1<\n/g 
:loop 
s/(\n[>][^ ]+)-([a-z ]*[<]\n?)/\1 \2/g 
t loop 
s/\n//g 

Тест:

sat:~# sed -r -f b.sed 
xy-uv>ab-cd-ed-ef-gh< 
xy-uv>ab cd ed ef gh< 
1

Это намного проще с awk чем sed, как вы можете сделать замены на заданных полях:

$ awk '{gsub(/-/," ",$2)}1' FS='>' OFS='>' file 
xy-uv>ab cd ed ef gh< 
+0

Если символы '' 'чередуются после' <', этот' awk' также удалит их. – Birei

+0

Если это была проблема с запросом, это можно было бы исправить, установив несколько символов, а 'FS', используя оператор или класс символов, и' OFS' будет зависеть от заданной проблемы. –

0

Это может сработать для вас (GNU sed):

sed -r ':a;s/(>[^<]*)-([^<]*<)/\1 \2/;ta' file 
Смежные вопросы