Sed (или другой) скрипт для замены персонажа в группе захвата

0

Я пытаюсь преобразовать разметку Pandoc в разметку wiki Confluence, я использую markdown2confluence сделать основную часть работы. Это работает довольно хорошо, за исключением тех случаев, когда я говорю о CSS и FreeMarker, которые используют { & Амп; } в коде, пока Confluence использует {{ & Амп; }} отметить начало / конец блока кода. Поэтому мне нужно соответствовать шаблону, заключенному в {{...}},

Если бы я знал (больше) Ruby, я мог бы починить его там, но я парень из Unix старой школы, поэтому я подумал о awk или sed.

Итак, я дошел до:

   sed 's/{{\([^}}]*\)}}/{{"\1"}}/g' tmp.wkd

который занимает:

First we need a way to select a state (or group of states) CSS uses what
is called a selector to choose which elements to apply to, we have been
using one up until now without noticing, it is the {{*}} at the beginning
of our CSS. This is a special selector that means select everything. So
the rule that follows it (the bit between {{{}} and {{}}} apply to every
polygon on the map. But CSS allows us to insert a filter instead by
using {{[...]}} instead of {{*}}.

и производит:

First we need a way to select a state (or group of states) CSS uses what
is called a selector to choose which elements to apply to, we have been
using one up until now without noticing, it is the {{"*"}} at the beginning
of our CSS. This is a special selector that means select everything. So
the rule that follows it (the bit between {{"{"}} and {{""}}} apply to every
polygon on the map. But CSS allows us to insert a filter instead by
using {{"[...]"}} instead of {{"*"}}.

Но то, что мне нужно, это:

First we need a way to select a state (or group of states) CSS uses what
is called a selector to choose which elements to apply to, we have been
using one up until now without noticing, it is the {{*}} at the beginning
of our CSS. This is a special selector that means select everything. So
the rule that follows it (the bit between {{\{}} and {{\}}} apply to every
polygon on the map. But CSS allows us to insert a filter instead by
using {{[...]}} instead of {{*}}.

Также необходимо обрабатывать {{${type.name}}} который должен стать {{$\{type.name\}}},

Есть две проблемы

  1. Мне нужно заменить { с \{ вместо использования кавычек, поэтому мне нужно изменить \1 как-то.
  2. Противный вид {{}}} (который должен прийти {{\}}} не получается, независимо от того, как я пытаюсь закончить сопоставление с образцом.
Ian Turton
источник
1
Можете ли вы опубликовать желаемый результат из приведенного выше примера?
chaos
было бы немного менее уродливо, если бы вы использовали sed -r, тогда вы могли бы сказать (`` вместо \(
barlop

Ответы:

2

Кажется, работает следующая команда sed:

   sed 's/{{\([^*[a-z][^}]*\)}}/{{\\\1}}/g;s/{{\\${\([^}]*\)}}}/{{$\\{\1\\}}}/g'

Объяснение:

  1. {{\([^*[a-z][^}]*\)}} находки {{stuff}}кроме случаев, когда stuff начинается с * или же [ или строчная буква.
  2. Замени это {{\stuff}},
  3. затем {{\\${\([^}]*\)}}} находки {{\${junk}}},
  4. И заменяет его {{$\{junk\}}},

редактировать Альтернативное решение после разъяснения со стороны ФП может быть следующим:

   sed 's/\({{[^}]*\){\([^}]*}}\)/\1\\{\2/g;s/\({{[^}]*\)}}}/\1\\}}}/g'

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

Объяснение:

  1. \({{[^}]*\){\([^}]*}}\) находки {{foo{bar}}, где foo а также bar не содержат },
  2. И заменяет его {{foo\{bar}}, (Заметка {{xxx{yyy}}} обрабатывается нормально.)
  3. затем \({{[^}]*\)}}} находки {{baz}}}, где baz не содержит },
  4. И заменяет его {{baz\}}},

foo, bar, а также baz может быть пустым, например {{}}} преобразуется в {{\}}}, как требуется.

Joseph Quinsey
источник
закрыть, но он преобразует {{type}} в {{\ type}}, в то время как он должен оставаться {{type}}
Ian Turton
@ Я добавил a-z чтобы убедиться, что {{type}} остается неизменной. Но каковы правила для type?
Joseph Quinsey
в основном все, что не является {или}, должно быть неизменным между {{}}
Ian Turton
@iant Спасибо за дополнительную информацию. Возможно, я удалю этот ответ и отправлю лучший.
Joseph Quinsey
2
Вы пишете "Возможно, я удалю этот ответ и отправлю лучший." & Lt; --- Есть кнопка редактирования.
barlop