Как указать sed, что нужно выполнить замену только один раз при использовании нескольких выражений замены?

Как указать sed, что нужно выполнить замену только один раз при использовании нескольких выражений замены?

У меня есть несколько правил подстановки, но я хочу использовать только первое применимое правило. sed, по умолчанию, продолжает обработку вывода с оставшимися правилами. Как мне прерваться после первой подстановки? Возможно ли это с помощью просто sed? Я не смог найти опцию в руководстве.

Фактический объем производства

$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"

three

Желаемая операция

$ sed "s/something/else/; s/one/two/; s/two/three/;" <<<"one"

two

решение1

Используйте tкоманду после каждой sкоманды для перехода к концу скрипта, если была сделана замена:

sed -e 's/something/else/;t' \
    -e 's/one/two/;t' \
    -e 's/two/three/;t' <<<"one"

Здесь tкоманда после последней подстановки не нужна, но если вы сгенерируете этот код автоматически, то нет никаких проблем с добавлением к нему суффикса к каждому s, даже к последнему.

решение2

sed с веткой «t» в другой команде — идеальный ответ.

Это всего лишь предложение, в случае, если вы хотите сделать несколько вещей внутри, если он заменен, вы можете использоватьawk:

awk ' { if (gsub("something","else",$0) || gsub("one","two",$0) || gsub("two","three",$0) ){ print $0;exit}; }' <<<"one"

решение3

Они оцениваются по порядку, поэтому, если круга нет и вы можете легко это сделать, вы можете просто использовать

s/two/three/; s/one/two/; s/something/else/

Если есть круг или список сформирован из других данных, можно использовать маркер, например

s/@/@@/g
s/one/t@wo/
s/two/t@hree/
s/something/e@lse/
s/@\(.\)/\1/g

Связанный контент