grep出力から一致するパターンを削除しますか?

grep出力から一致するパターンを削除しますか?

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 -psedsed


では、zsh次のことができます。

typeset ${(k)parameters[(R)scalar]}

変数定義の印刷スカラー属性がありません(特別な...でもない)これがあなたの意図のようです。

typesetsilentただし、関数内で呼び出されるか(この場合はすべての変数をローカル変数として宣言します)、オプションが有効な場合は効果はありません。

この問題を解決し、値参照方法をより効果的に制御するもう1つの方法は次のとおりです。

() for 1 do print -r -- $1=${(Pq+)1}; done ${(k)parameters[(R)scalar]}

q+使用されているものと同様の引用スタイルを提供しますtypesetqq使用より安全な引用スタイルこの出力をシェルで使用したい場合(zshではないか、同じバージョンではないか、同じロケールまたはOS / libcではない可能性があります)

おすすめ記事