На основании того, что вы показали, вы можете сделать что-то вроде:
sed -r -e "s/($2)/_\1_/g" -r -e "s/($2)_s|^($2)(_*)/\1s\2_/g" -r -e "s/^_|_$//g"
Это должно вернуть конечный результат:
chocolate_cakes
the_cake_ismine
cakes_surpassexpectation
Идея здесь заключается в том, что процесс исключается;это не означает, что у этого метода нет потенциальных проблем - надеюсь, вы поймете, что я имею в виду ниже.Каждая операция sed
помечена номером, чтобы вы могли видеть, что происходит.
Команды sed
работают с массивом, который начинается с «is», а затем «cake»:
1. is -> _is_
2. is_s or is_ -> iss or is_
3. _is_ -> is
1. cake -> _cake_
2. cake_s or cake_ -> cakes or cake_
3. _cake_ -> cake
строка один :
1. chocolatecakes -> chocolate_cake_s
2. chocolate_cake_s -> chocolate_cakes_
3. chocolate_cakes_ -> chocolate_cakes
строка два :
1. thecake_is_mine -> the_cake_ismine
2. the_cake_ismine -> no change
3. the_cake_ismine -> no change
строка три :
1. cakessurpassexpectation -> _cake_ssurpassexpectation
2. _cake_ssurpassexpectation -> _cakes_surpassexpectation
3. _cakes_surpassexpectation -> cakes_surpassexpectation
Итак, вы можете увидеть здесь, в чем может быть проблема с частью массива "is";возможно, он может быть поврежден, возможно, нежелательным образом во время операции sed
, если каким-то образом он станет «is_s» в операции № 2. Здесь вы захотите протестировать несколько комбинаций ваших строк, чтобы убедиться, что вы 'Мы рассмотрели все возможные сценарии, которые вам не нужны.После того, как вы это сделаете, вы можете вернуться и уточнить шаблоны по мере необходимости, или даже дальше найти способы оптимизировать вещи таким образом, чтобы вы могли использовать команды с меньшим количеством каналов.