スペースを保持しながらコマンドライン引数を変更する

スペースを保持しながらコマンドライン引数を変更する

実行中のダウンストリームコマンドに合わせて自動的にフォーマットするために渡されるコマンドライン引数をオプションで置き換えたいと思います。論争には空白があり、それが議論の内容です。

私は現在これをやっています:

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、、、、-は別々のパラメータとして扱われますhandlenull

ベストアンサー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[@]}"

sedSEARCHとREPLACEをいくつかのエスケープ処理よりも優れています。


1 例外は累積されます。たとえば、いくつかのユーティリティよりも--quiet --quiet静かな、または複数の出力フィールドを指定する--quietために使用されます。場合によっては、順序が重要です。たとえば、に変更すると、に変更するのと同じ操作が実行されない可能性があります。-o pid -o ppidps--description=foo --no-description--description=bar --no-description--description=foo --no-description --description=bar

おすすめ記事