5

Учитывая этот вклад:

 "hell -- 'this -- world --is'-- beautiful' --thanks-- we'-- are-- here" 

Я хочу заменить каждое '-' между одинарными кавычками на 'XXX', используя sed . Он должен дать следующий вывод:

Вывод: «ад -« этот XXX мир XX-Xis »- красивый« XX-X благодаря XXX мы »- здесь»

Количество замен может быть неизвестно (до бесконечности).

4 ответа4

9

Редактировать:

Используя ваше новое требование:

sed 's/\o47[^\o47]*\o47/\n&\n/g;:a;s/\(\n\o47[^\n]*\)--/\1X-X-X/;ta;s/\n//g' input file

Изменить 2:

Для некоторых версий sed которые не любят точки с запятой:

sed -e 's/\o47[^\o47]*\o47/\n&\n/g' -e ':a' -e 's/\(\n\o47[^\n]*\)--/\1X-X-X/' -e 'ta' -e 's/\n//g' inputfile

Если ваш sed также не поддерживает восьмеричные коды escape:

sed -e "s/'[^']*'/\n&\n/g" -e ':a' -e "s/\(\n'[^\n]*\)--/\1X-X-X/" -e 'ta' -e 's/\n//g' inputfile

Оригинальный ответ:

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

sed 's/--/X-X-X/g' inputfile

или же

var="hell --this -- world is --beaut--iful"
newvar=$(echo "$var" | sed 's/--/X-X-X/g')

Без модификатора g замена выполняется при первом совпадении в каждой строке ввода. Когда используется g , каждое совпадение в каждой строке ввода заменяется. Вы также можете сделать замену для конкретных матчей:

$ var="hell --this -- world is --beaut--iful"
$ echo "$var" | sed 's/--/X-X-X/2'
hell --this X-X-X world is --beaut--iful
7

Вы хотите использовать ключ /g в конце, чтобы проанализировать более одной замены в строке.

sed s/--/X-X-X/g
5
$ echo "hell --this -- world is --beaut--iful" | sed s"/--/X-X-X/g"
hell X-X-Xthis X-X-X world is X-X-XbeautX-X-Xiful

Ключом является ключ g : он заставляет sed заменять все вхождения.

0
echo "     -- hell     -- this ------   world       ---- test"  |\
sed -r 's/[ ]+[-]+[ ]+/ x-x-x /g'

дает:

 x-x-x hell x-x-x this x-x-x world x-x-x test

Последовательность символов в скобках совпадает для повторения один или несколько раз с символом плюса.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .