2016-11-22 5 views
0

Скажем, у меня есть этот кусок текста:Заменить точки подчеркивания в правой части строки

some.blah.key={{blah.woot.wiz}} 
some.another.foo.key={{foo.bar.qix.name}} 
+ many other lines with a variable number of words separated by dots within {{ and }} 

я хотел бы следующий результат после замены точки подчеркивания в правой части (между {{ и }} разделители):

some.blah.key={{blah_woot_wiz}} 
some.another.foo.key={{foo_bar_qix_name}} 
... 

Я ищу соответствующее регулярное выражение, чтобы выполнить замену в один-лайнер sed command`.

Я нахожусь на свинце с этим: https://regex101.com/r/8wsLHo/1, но он захватывает все точки, в том числе и левую часть, которую я не хочу. Я попробовал этот вариант, чтобы исключить те, в левой части, но тогда ничего не захватить больше: https://regex101.com/r/d7WAmX/1

+0

Ваши разделители являются '{{' и '}}', поэтому я предполагаю, что вы можете иметь индивидуальные символы '{' или '}' в тексте, например. 'some.blah.key = {{abc {def} ghi}}', правильно? Вы должны включить это в свой пример ввода/вывода или вы получите решения, которые не сработают, когда это произойдет. –

ответ

4

Вы можете использовать цикл:

sed ':a;s/\({{[^}]*\)\./\1_/;ta' file 

:a определяет метку " a "
ta переходит на« а », когда что-то заменяется.

+2

Очень умное решение. – Cyrus

+0

@Cyrus: Спасибо <°))))))))> –

+0

Я играл с ним и немного убрал его. Для замены (с помощью GNU sed) справа от '=': 'sed -r ': a; s/(=. *) \ ./ \ 1 _ /; ta' file' и слева от' = ':' sed -r ': a; s/\. (. * =)/_ \ 1 /; ta' file' – Cyrus

2

Я пришел с этим довольно сложным однострочником:

sed "h;s/=.*/=/;x;s/.*=//;s/\./_/g;H;x;s/\n//" 

объяснение:

  • h: положить линии в трюме буфере
  • s/=.*/=/: затирать правая часть после =
  • x: своп поставить строку в основном буфере снова, первую часть в трюме буфере
  • s/.*=//: колошматить оставили часть перед =
  • s/\./_/g: выполнение работ по замене точек теперь, что есть только правая часть в основном буфере
  • H : добавление основного буфера для хранения буфера
  • x: своп буферов снова
  • s/\n//: удалить новую строку или появляются оба частей на отдельных строках

, что было довольно весело, но, возможно, sed не самый лучший инструмент для выполнения этой операции, это скорее относится к code golf

Смежные вопросы