単語全体を一致させようとすると、正規表現は失敗します。

単語全体を一致させようとすると、正規表現は失敗します。

これは私のテストファイルtest.txtです。

hello

user1 ALL=(ALL) NOPASSWD: /usr/bin/* /app/tomcat/tomcat*/webapps/*, /usr/bin/rm -rf /app/tomcat/tomcat*/webapps/*,/bin/rm -rf /app/tomcat/tomcat*/webapps/**.sh , /bin/kill -3 *

次の正規表現を使用して、必要な行を正常に見つけることができました。

grep -P '(^[^#;]ser1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

user1ただし、正規表現の代わりに完全な単語を指定すると、ser1一致するものはありません。

次の理由で正規表現が失敗します。

grep -P '(^[^#;]user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

user1その行に一致する正規表現を提供したいと思います。

何か提案してもらえますか?

答え1

問題は、2つを明示的に達成しようとしていますが、2つがお互いを暗示していることです。

  • この行は次に終了する必要があります。user1
  • 行はコメント記号(#または)で;始まってはいけません。

#ただし、2番目の正規表現では、「行はまたは文字以外で始まる必要があり、次のものを含める必要があり;ますuser1。したがって、grep前に文字が続くと予想されます。user1これは、「すべての文字」を要求する最初の正規表現では問題ではありません#。以外の文字で始まるのと同様に、or以外の文字の;後に「が続きます。ser1user1#;

行がで始まると確信している場合は、user1単に次のものを使用できます。

grep -P '^user1 etc.'

または席がある場合、

grep -P '^ *user1 etc.'

答え2

正規表現を行の先頭に固定します。

^[^#;]ser1

#これは、「or以外の文字で始まり、;後に文字列が続く一致行を意味します。ser1したがってofと一致します[^#;]。完全な単語を提供するには、次に直接始まる行を見つける必要があります。uuser1user1

^user1

または、次のパターンがゼロ回発生することを許可します[^#;]

^[^#;]*ser1

したがって、完全なコマンドは次のようになります。

grep -P '(^user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

または

grep -P '(^[^#;]*user1.*ALL=\(ALL\) NOPASSWD.*\/app\/tomcat.*$)' test.txt

しかし、これは非常に複雑に見えます。本当に必要なものは次のとおりです。

grep -P '^[^#;]*user1'

この例では。

関連情報