grep을 사용하여 공백을 포함하거나 시작 또는 끝에서 시작하는 문자열을 찾습니다.

grep을 사용하여 공백을 포함하거나 시작 또는 끝에서 시작하는 문자열을 찾습니다.

공백으로 묶여 있거나 처음이나 끝에서 오는 일부 문자열을 일치시키는 방법은 무엇입니까?

-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는 이를 좋아하는 것 같지만 \\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.

관련 정보