Bashを使用して次のコマンドを実行します。declare -p | grep 'declare -- '
これにより、行全体が印刷されます。同じ行を印刷したいのですが、一致自体を除外したいです。つまり、... | grep pattern | sed 's/pattern//'
単一のコマンドで実行できますか? optionsの逆と同じです-o
。
私のコマンドの出力は次のとおりです。
...
declare -- MAX_CONNECTIONS_PER_SERVER="6"
declare -- OPTERR="1"
declare -- OSTYPE="linux-gnu"
...
しかし、私はこれを出力したいと思います:
...
MAX_CONNECTIONS_PER_SERVER="6"
OPTERR="1"
OSTYPE="linux-gnu"
...
普通はただパイプでつながっていましたが、sed
偶然今日はパイプを二度やりたかったです。マニュアルページを見ましたが、これを行うオプションはありません。
一致するパターンに続く行部分のみを返します非常に似た質問です。たぶん繰り返しかもしれません。私は少し狭いと言うことができます。これは、私が探しているパターンと削除するパターンが同じであることを保証します。削除したいですx
。質問を削除したいです.*x
。
ベストアンサー1
それは次のようになります。
declare -p | sed -n 's/^declare -- //p'
ただし、出力を解析するこの方法にはdeclare -p
欠陥があります。
VAR=$'\ndeclare -- reboot #'
たとえば、環境に1つがあり、解釈のためにその出力をシェルに供給する場合はどうなりますか?
また、宣言されているが値が割り当てられていない変数の場合bash
:が印刷されるため、declare -- VARNAME
それ以降はdeclare reboot
上記のコードも印刷されますreboot
。
次のように変更できます。
declare -p | LC_ALL=C sed -n 's/^declare -- \(.*=\)/\1/p'
割り当てられた変数を制限しますが、これは改行文字を含む変数の問題を解決しません(変数に固有の場合でも一般的です$TERMCAP
)。
代わりに、次のハッキングを使用できます。
(
export LC_ALL=C
eval '
declare()
if [[ $1 = -- ]]; then
printf "%s=%q\n" "${2%%=*}" "${2#*=}"
fi'"
$(declare -p | sed 's/[][()]/\\&/g')"
)
declare -p
関数でオーバーライドした後(最初の引数がある場合は2番目の引数を印刷)、配列と関連配列の表現に使用されるescapes(
と)
の出力を評価します[
。 bashの出力は過去には安全ではなかったと考えられており、特に許可されている行の長さに制限がある実装では、エスケープを追加すると複雑さが増す可能性があります。]
declare
--
declare -p
sed
sed
では、zsh
次のことができます。
typeset ${(k)parameters[(R)scalar]}
変数定義の印刷スカラー属性がありません(特別な...でもない束)これがあなたの意図のようです。
typesetsilent
ただし、関数内で呼び出されるか(この場合はすべての変数をローカル変数として宣言します)、オプションが有効な場合は効果はありません。
この問題を解決し、値参照方法をより効果的に制御するもう1つの方法は次のとおりです。
() for 1 do print -r -- $1=${(Pq+)1}; done ${(k)parameters[(R)scalar]}
q+
使用されているものと同様の引用スタイルを提供しますtypeset
。qq
使用より安全な引用スタイルこの出力をシェルで使用したい場合(zshではないか、同じバージョンではないか、同じロケールまたはOS / libcではない可能性があります)