egrepが負のスペースを無視するのはなぜですか?

egrepが負のスペースを無視するのはなぜですか?

grep -E負のスペースを使用すると、期待どおりに機能しないのはなぜですか?つまり[^\s]+

私の構文を分析するために正規表現を作成しました。.ssh/config

grep -Ei '^host\s+[^*\s]+\s*$' ~/.ssh/config

# cat ~/.ssh/config
Host opengrok-01-Eight
    Hostname opengrok-01.company.com

Host opengrok-02-SIX
    Hostname opengrok-02.company.com

Host opengrok-03-forMe
    Hostname opengrok-03.company.com

Host opengrok-04-ForSam
    Hostname opengrok-04.company.com

Host opengrok-05-Okay
    Hostname opengrok-05.company.com

Host opengrok-05-Okay opengrok-03-forMe
    IdentityFile /path/to/file

Host opengrok-*
    User root

私が得るものは

Host opengrok-01-Eight
Host opengrok-03-forMe
Host opengrok-05-Okay
Host opengrok-05-Okay opengrok-03-forMe

シックスとサムはどこにありますか!

[^\s*]+つまり、空白でないか*、1以上でない項目と一致するのが実際に、、\1以上でない項目と一致することに気づくのに時間がかかりました!s*

正規表現はrex101.com(perlを使用)で動作するため、修正は非常に簡単です。つまり、-Eスイッチ-P

# grep -Pi '^host\s+[^*\s]+\s*$' ~/.ssh/config
Host opengrok-01-Eight
Host opengrok-02-SIX
Host opengrok-03-forMe
Host opengrok-04-ForSam
Host opengrok-05-Okay

私が恐れていたのは、私がgrep -E長年にわたって多くのスクリプトでこれを使用してきましたが、以前はこれを見つけることができなかったことです。たぶん幸運だったかもしれませんが、私のテストケースがその極端なケースを逃した可能性が高くなります!

質問:

  1. grep -Pすべての拡張正規表現で使用するように変更することに加えて、grep -Eこの場合は正規表現をどのように書くべきですか?
  2. 私が見逃したり-E使用したりすると迷惑になる他の問題がありますか-P

grep (GNU grep) 3.1
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

Windows 10 で実行中、Ubuntu 18.04(bash) を実行する WSL... が、適切な Linux インストールでも同じ結果が得られます。

ベストアンサー1

の補数は、\sis \S、not [^\s]which(の助けを借りて-i) 'SIX'および 'Sam'にリテラルが含まれているため、結果から除外されますs


grep -i「ホスト」で始まり、1つ以上のスペースと行の終わりまで続く1つ以上の文字シーケンス(*単語やスペースが存在できない)を処理する方法:

grep -Ei '^host[[:space:]]+[^*[:space:]]+$' file
Host opengrok-01-Eight
Host opengrok-02-SIX
Host opengrok-03-forMe
Host opengrok-04-ForSam
Host opengrok-05-Okay

おすすめ記事