sed: замените любое количество случаев определенного шаблона

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

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

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

вывод: "ад - 'этот X-X-X мир X-X-Xis - красивый' X-X-Xthanks X-X-X мы' - здесь"

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

5
задан 20.03.2011, 13:35

3 ответа

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

sed s/--/X-X-X/g
7
ответ дан 07.12.2019, 16:47
$ 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 заменять все случаи.

5
ответ дан 07.12.2019, 16:47

Править:

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

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 также не поддерживает восьмеричные управляющие коды:

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

Исходный ответ:

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

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
8
ответ дан 07.12.2019, 16:47

Теги

Похожие вопросы