私は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