Sed без жадных фигурных скобок - PullRequest
0 голосов
/ 02 июня 2010

У меня есть строка в файле a.txt

{moslate}alho{/moslate}otra{moslate}a{/moslate}

необходимо получить строку otra, используя sed.

С этим регулярным выражением

sed 's|{moslate}.*{/moslate}||g' a.txt

a вообще не получает вывода, но когда я добавляю ? к регулярному выражению

s|{moslate}.*?{/moslate}||g a.txt

(я где-то читал, что это делает регулярное выражение нежадным) Я не получаю никакого соответствия, я имею в виду получить следующий вывод

{moslate}alho{/moslate}otra{moslate}a{/moslate}

Как получить требуемый вывод с помощью sed?

Ответы [ 3 ]

6 голосов
/ 02 июня 2010

SED не поддерживает сопоставление без жадности, поэтому вам нужно сделать термин «. *» Менее жадным, сделав его более требовательным к тому, что он примет. У меня нет корпуса того, что вы ищете, но я собираюсь предположить, что вы не хотите ничего находить со встроенными фигурными скобками. Если это так, то вы можете использовать:

sed 's|{moslate}[^{]*{/moslate}||g' a.txt

, который будет работать в случае, если вы дадите, но потерпит неудачу, если эти вещи вложятся.

4 голосов
/ 02 июня 2010

Если вы знаете, что строка между moslates не будет содержать фигурные скобки, вы можете сделать это:

sed 's/{moslate}[^{}]*{\/moslate}//g'
2 голосов
/ 02 июня 2010

«нужно получить» - в зависимости от контекста может показаться, что «получить» означает «удалить». Тем не менее, я обычно интерпретирую «получить», чтобы означать «получить» или «сохранить». Ваша команда sed говорит: «Удалить все». Как бы выглядел желаемый результат?

Предполагая, что вы имеете в виду «получить» или «сохранить», попробуйте следующее:

sed -n 's|.*{/moslate}\([^{]*\){moslate}.*|\1|p' a.txt

, который будет извлекать "otra" или что-либо еще в положении, которое "otra" занимает в этой строке (то есть между двумя наборами тегов "moslate").

Результирующий вывод:

otra

Если вы хотите удалить «otra»:

sed 's/otra//' a.txt

Выход:

{moslate}alho{/moslate}{moslate}a{/moslate}

Если вы хотите удалить все, что находится в позиции, которую «otra» занимает в этой строке (то есть между двумя наборами «moslate»):

sed -n 's|\(.*{/moslate}\)[^{]*\({moslate}.*\)|\1\2|p' a.txt

Выход:

{moslate}alho{/moslate}{moslate}a{/moslate}
...