空白で囲まれている、または最初または最後から来るいくつかの文字列を一致させる方法は?
-someword
次の文を一致させる必要があります:word1 -someword word2
、、、、。 そして、次の文では一致は必要ありません。-someword word1
word1 -someword
-someword
s-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はそれが好きなようですが、\\s
zshはそうです\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
。