Я хотел бы создать функцию bash, которая ведет себя следующим образом:
- Если передана строка без флагов, добавьте второй аргумент в качестве флагов
- Если передан любойфлаг, который находится во втором аргументе, оставьте его в флажках.
- Если передан любой флаг с буквой
c
или d
, мы удалим его. - Если есть какой-либо другойсимвол в флаге, мы хотим сохранить их и добавить второй аргумент в качестве флагов.
Например:
my_func 'cmd pattern' 'ab' #=> cmd -ab pattern
my_func 'cmd -a pattern' 'ab' #=> cmd -ab pattern
my_func 'cmd -ac pattern' 'ab' #=> cmd -ab pattern
my_func 'cmd -aef pattern' 'ab' #=> cmd -efab pattern
my_func 'cmd -deaf pattern' 'ab' #=> cmd -efab pattern
Это то, что я пробовал:
function my_func() {
echo $1 |
# case with no flags
sed "/^cmd [^-]/s/^cmd \(.*$\)/cmd -$2 \1/" |
# case with flags in $2 or `a` or `b`
sed "/^cmd -[$2ab]+ /s/^cmd -[$2ab] \(.*$\)/cmd -$2 \1/" |
# case with other flags
sed ...
}
Я борюсь с последним.Я не уверен, если это возможно, но хотел бы знать, если это так.
Это как-то захватывает флаги (cmd -\([a-z]\)
),
, затем удаляет abcd
из захватаgroup (sed 's/[abcd]//g'
в группе)
, затем принять это значение и добавить ab
в вывод.
Было бы также здорово узнать, есть ли более хорошая реализация, использующая что-то другоечем sed