LINUX.ORG.RU

помогите пожалуйста с [sed]

 


0

0

очередной раз прошу помощи!

подскажите, как вот в таком примере:

hello [[hello | [hola])]] good [[buy]]

сделать так, чтобы заменить на такое:

hello <A>[hola])<B> good <A>buy<B>

пытаюсь добиться этого таким скриптом:

sed '/\[\[.*|.*\]\]/s/\[\[[^]|]*|/<A>/g; s/<A>[^]]*\]\]/&<B>/g; s/\[\[[^]]*\]\]/<A>&<B>/g; s/\[\[//g; s/\]\]//g'

но получается:

hello <A> [hola<B>) good [[buy]]

тоесть вопрос вот в чем - как указать, что должно быть 2 символа ]] в ряде [^]]?

чтото никак не одолею

уфф, получилось по-красивее решить задачу :)

:link1
/\[\[.*|/ {
	s/\[\[[^]|]*|/<A>/
	s|\]\]|<\/A>|
	b link1
	}

:link2
/\[\[.*\]\]/ {
	s/\[\[/<B>/
	s|\]\]|<\/B>|
	b link2
	}

elfrock
() автор топика
Ответ на: комментарий от elfrock

Блин, столкнулся с проблемой..
в случае замороченных скобок, это неверно срабатывает.

если текст такой:
[[hello]] |[[hello|[hola])]] {{good|goodest}} [[buy|buer]] [[buy]]
то по идее надо чтобы осталось только такое:
<B>hello</B |<A>hola])</A> good|goodest <A>buer</A> <B>buy</B>

но скрипт срабатывает не так как хочется, оставляя такое:
<A><A>[hola])</A> good|goodest <A>buer</A> <B>buy</B>

поскольку в первой части скрипта каждый раз идет замена до символа |
вопрос- как сделать чтобы проверка на конструкцию [[текст| шла в начальной строке, а не каждый раз после обработки этих конструкций (по link1)???

elfrock
() автор топика
Ответ на: комментарий от elfrock

мой скромный вариант, я sed почти не знаю

$ echo '[[hello]] |[[hello|[hola])]] {{good|goodest}} [[buy|buer]] [[buy]]' | sed -e 's/\[\[\([^]|]\{1,\}|\)\(\(\]\{0,1\}[^]]\)*\)\]\]/<A>\2<B>/g' -e 's/\[\[\(\(\]\{0,1\}[^]|]\)*\)\]\]/<C>\1<D>/g'

<C>hello<D> |<A>[hola])<B> {{good|goodest}} <A>buer<B> <C>buy<D>

если бы вы писали на перле, жизнь была бы, думаю, легче
(если в sed все-таки нет заглядывания и нежадности)

kaj
()
Ответ на: комментарий от kaj

щас попробую ваш вариант, спасибо! )
сам решил проблему через Ж, поскольку тэги  A и B
одинаковые, решил все таким способом:

:link
/\[\[.*\]\]/ {
	s/\[\[/<i>/
	s|\]\]|<\/i>|
	b link
	}
s/<i>[^<]*|/<i>/g

хотя и знаю что это немного неправильно, и по сути костыль, и если бы нужны были разные тэги - не сработало бы.

elfrock
() автор топика
Ответ на: комментарий от kaj

2kaj: спасибо огромное, отлично работает скрипт! пытаюсь разобраться как работает, но не все понимаю, не могли бы вы по порядку прояснить как это работает? очень прошу!) всетки хочется разобраться с регулярками.

elfrock
() автор топика
Ответ на: комментарий от elfrock

ну, в 1-м ищем чтобы между \[\[ .... \]\] :
сначала шло что-то кроме ] и | :
\([^]|]\{1,\}|\)
потом |
а потом
\( ..... \) - захватываем в скобки все что потом, а между ними:
\( \]\{0,1\}[^]] \)*
внутри повторяется: не-] сколько-то раз, затем возможно ], но тогда после нее не-] (т.е только одиночные ])

а во 2-м все также но без части до |

как-то так :)

kaj
()
Ответ на: комментарий от kaj

спасибо огромное!
начинаю разбираться потихоньку в sed'е :)
никак не мог понять конструкцию \( \]\{0,1\}[^]] \)*
сейчас вроде разобрался.
еще раз спасибо!

elfrock
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.