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

Обращаясь к вашему рабочему процессу, а не к точно заданному вопросу, я бы использовал функцию для такой ситуации:

t() { task proj:job "$@"; }

t add +hard Refactor the API
t +easy add prio:H Fix typo in README
t next

Преимущество функции перед псевдонимом заключается в том, что заполнитель можно поместить в любом месте шаблона команды, а не только в конце строки.

Исходя из вашего указания о желании избежать накладных расходов на ведущее t, я полагаю, вы могли бы попробовать что-то вроде этого:

add() { task proj:job add "$@"; }
next() { task proj:job next; }

add +hard Refactor the API
add +easy prio:H Fix typo in README
next
10
16.04.2020, 16:44
3 ответа

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

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

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

17
19.03.2021, 02:29

sed с ветвью 't' в другой команде - идеальный ответ.

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

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

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

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
1
19.03.2021, 02:29

Теги

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