grep を使用して、スペースを含めるか、開始または終了で始まる文字列を検索します。

grep を使用して、スペースを含めるか、開始または終了で始まる文字列を検索します。

空白で囲まれている、または最初または最後から来るいくつかの文字列を一致させる方法は?

-someword次の文を一致させる必要があります:word1 -someword word2、、、、。 そして、次の文では一致は必要ありません。-someword word1word1 -someword-somewords-someword-somewordd

上記を正規表現grep -r [^ ]-someword[$ ](たとえば、-someword前にスペースを入れるか、-someword文を始める必要があり、-someword後にスペースを入れる必要があるか、または-someword文を終了する必要がある)を使用してgrepingを試みましたが、何も見つかりませんでした。

答え1

努力する:

grep -w -e -someword

からman grep

-w, --word 正規表現

          Select only those lines containing matches that form whole
          words.  The test is that the matching substring must
          either be at the beginning of the line, or preceded by a
          non-word constituent character.  Similarly, it must be
          either at the end of the line or followed by a non-word
          constituent character.  Word-constituent characters are
          letters, digits, and the underscore.  This option has no
          effect if -x is also

-somewordスペース以外に英数字以外の文字(または)などで囲まれている場合#も一致します,。囲まれていることを確認したい場合ただスペースまたは行の開始/終了を使用して、次のものを使用できます。

egrep '(^|[[:space:]])-someword([[:space:]]|$)'

# Which is equivalent to:

grep -E '(^|[[:space:]])-someword([[:space:]]|$)'

# Or without extended regex:

grep '\(^\|[[:space:]]\)-someword\([[:space:]]\|$\)'

答え2

複雑な正規表現を避けるために、次のものを使用できます。-someword先頭に空白があるか、-someword両側に空白があるか、最後に空白がある-somewordすべての行と一致します。

grep -e '^-someword ' -e ' -someword ' -e ' -someword$'

これはすべて、-someword正規表現の特殊文字を含まない文字列であると仮定します。その場合は、これらのリテラル文字と一致するように文字列を書き換える必要があります(パターン内の文字をエスケープするなど)。

文字列のみを含む行も一致させるには、-somewordを追加します-e '^-someword$'

「スペース」がタブとスペースを含む「スペース文字」を意味する場合は、変更パターンにリテラルスペースを使用します[[:blank:]]。垂直タブやキャリッジリターンなど、より広い範囲のスペースに似た文字を一致させる必要がある場合は、代わりにを使用してください[[:space:]]

答え3

正規表現パターンは(https://regexr.com/7b8g0):

(\s|^)-someword(\s|$)

多くのシェルがこれを恐れているので、()\|引用符を修正して少しエスケープする必要があります。たとえば、fishはそれが好きなようですが、\\szshはそうです\s

ripgrepとFishを使用すると非常に簡単です。

$ bat word.txt --style=numbers
   1 word1 -someword word2
   2 -someword word1
   3 word1 -someword
   4 -someword
   5 s-someword
   6 -somewordd
   7 \s-someword

$ bat word.txt | rg '(\\s|^)-someword(\\s|$)' --only-matching --line-number
1: -someword
2:-someword
3: -someword
4:-someword

$ bat word.txt | rg '(\\s|^)-someword(\\s|$)' --line-number -v
5:s-someword
6:-somewordd
7:\s-someword

(コメントにいくつかの問題を解決するために\s-someword追加しました。)-v

スペースは一致の一部になります。正規表現でこの問題を解決するには、周囲にキャプチャグループを追加し-someword(単純)、rg最初のグループ(pffft ...)を返すように指示する必要があります。

grepは古すぎるため、デフォルトではこの「高度な」正規表現構文は処理されません。 -E.

$ bat word.txt | grep -E '(\\s|^)(-someword)(\\s|$)' -n
1:word1 -someword word2
2:-someword word1
3:word1 -someword
4:-someword

$ bat word.txt | grep -v -E '(\\s|^)(-someword)(\\s|$)' -n
5:s-someword
6:-somewordd
7:\s-someword

正直なところ、2で始まる年に住んでいる場合は、grep別名を使用する必要がありますgrep -E。または単に使用してくださいrg

関連情報