選択した文字列を次に区切ってキャッチする方法 -

選択した文字列を次に区切ってキャッチする方法 -

私はgrepを初めて使用しており、パッケージのリストがあり、特定の結果を表示するだけです。

パッケージのリストは次のとおりです。

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-dbg/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-doc/oldoldstable,oldoldstable 2.4.25-3+deb9u12 all
apache2-ssl-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-custom/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-pristine/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

正規表現を使用しようとしましたが、何か間違っていることは確かです。

cat list | grep 'apache2-(bin|data|utils)'

これが私の予想結果です。

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

私のコマンドで何が間違っているか欠けていますか?

答え1

|デフォルトの基本規則式(BRE)パターンマッチングを使用する場合は、エスケープ角かっこと文字が必要です。grepだから:

grep '^apache2-\?\(bin\|data\|utils\|\)/'

-Eまたは、スイッチに一致する拡張正規表現(ERE)パターンを有効にします。

grep -E '^apache2-?(bin|data|utils|)/'

メモ:

  • 他の多くのツールと同様に、ファイルから直接読み取るため、フィードをgrep使用する必要はありません。cat
  • ^行の先頭に合わせて行の先頭を追加しました。
  • ハイフンと0回または1回だけ一致する-?EREとBREを-\?追加しました。また、使用されている標準BREは機能しません(少なくともGNUまたは他のツールでは機能しますが)。 BREは。-\?\?\{0,1\}
  • |空の最後の一致を追加すると、行を含むものと同じものと一致します(...|...|...|)apache2ただし、入力に何も含まれている場合は一致しますが、apache2-一致しない場合はgrep -E '^apache2(-(bin|data|utils)|)/'代わりに使用してください)。
  • 使用されるものも\|標準BREではなく、それに対応するものもありません。 EREが提供する代替手段を使用することをお勧めします。

また、見ることができます私の正規表現がXでは動作しますが、Yでは動作しないのはなぜですか?

答え2

この試み: grep -Ex 'apache2(-(bin|data|utils))?' list

出力:

apache2
apache2-bin
apache2-data
apache2-utils

そう、質問が変わりました:)。

grep -E 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list

出力:

apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]

これにより、-x(正確に一致)は必要ありません。

-E スイッチの代わりに egrep を使用できます。 egrep 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list

関連情報