공백으로 묶여 있거나 처음이나 끝에서 오는 일부 문자열을 일치시키는 방법은 무엇입니까?
-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
.