Учитывая этот вход:
"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 мы' - здесь"
Количество замен может быть неизвестным (до бесконечности).
$ 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
заменять все случаи.
Править:
Используя Ваше новое требование:
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