実行中のダウンストリームコマンドに合わせて自動的にフォーマットするために渡されるコマンドライン引数をオプションで置き換えたいと思います。論争には空白があり、それが議論の内容です。
私は現在これをやっています:
set -- $(echo $* | sed -e "s/$_ARG/--description=\"$_ID - $_SUMMARY\"/")
新しい引数が--description="$_ID - $_SUMMARY"
分割されます。
ダウンストリームコマンドを実行します。
<cmd> "$@"
パラメータはいくらでも持つことができますが、サンプルのユースケースは次のとおりです。
~から
activity --description='handle null'
到着する:
activity --description='$SOME_VARIABLE - handle null'
結局のところ、ダウンストリームコマンドを実行すると、「$ @」を使用してもすでに分割されており、期待どおりに機能しません。それは結局次のようになる
activity --description=value - handle null
--description=value
、、、、-
は別々のパラメータとして扱われますhandle
。null
ベストアンサー1
ksh93、zsh、またはbashでは、次のことができます。
set -- "${@/#--description=*/--description=$NEW_DESCRIPTION}"
開始位置パラメータ(#
先頭にパターンを固定する)--description=
をに置き換えるには--description=<contents-of-NEW_DESCRIPTION-variable
。
を使用すると、ksh93
次のように短縮できます。
set -- "${@/#@(--description=)*/\1$NEW_DESCRIPTION}"
以下と同じzsh -o extendedglob
:
set -- "${@/#(#b)(--description=)*/$match[1]$NEW_DESCRIPTION}"
しかし、たぶんこれを行うことができます:
set -- "$@" "--description=$NEW_DESCRIPTION"
ほとんどのユーティリティは同じオプションの複数の使用を許可し、最後に発生したオプションが優先されます。たとえば、
$ echo x | grep -H --label=foo --label=bar .
bar:x
では、zsh
次のことができます。
argv[(i)--description=*]=--description=$NEW_DESCRIPTION
で始まる最初の引数を置き換えるか--description=
、--description=<contents-of-NEW_DESCRIPTION-variable
見つからない場合は新しい引数として追加します。
または:
argv[(I)--description=*]=--description=$NEW_DESCRIPTION
置換される最後の一致と呼ばれる点と一致しない場合は、最初に挿入される点以外は同じです。
1つのパラメータを複数のパラメータに置き換えることもできます。
argv[(i)--description=*]=(--description=$NEW_DESCRIPTION --other-args)
--description
または、パラメータと後続のパラメータを次のように置き換えます--description=$NEW_DESCRIPTION
。
argv[n=argv[(i)--description],n+1]=--description=$NEW_DESCRIPTION
--description
(再び、最後に追加された要素ではifが見つかりません。)
削除するみんなパラメータは次の形式で始まり--description=
、最後に1つを追加します。
set -- "${@:#--description=*}" --description=$NEW_DESCRIPTION
4.4+でbash
パラメータを一部変換するもう1つのオプションは、perl
位置パラメータを引数として渡し、それをNULで区切られたリストに読み直すことです(変数にはbash
とにかくNULを含めることはできません)。
readarray -td '' newargs < <(
SEARCH="$_ARG" REPLACE='--description=something' perl -l0e '
for (@ARGV) {
s/\Q$ENV{SEARCH}\E/$ENV{REPLACE}/;
print;
}' -- "$@"
)
set -- "${newargs[@]}"
sed
SEARCHとREPLACEをいくつかのエスケープ処理よりも優れています。
1 例外は累積されます。たとえば、いくつかのユーティリティよりも--quiet --quiet
静かな、または複数の出力フィールドを指定する--quiet
ために使用されます。場合によっては、順序が重要です。たとえば、に変更すると、に変更するのと同じ操作が実行されない可能性があります。-o pid -o ppid
ps
--description=foo --no-description
--description=bar --no-description
--description=foo --no-description --description=bar