고정된 패턴/문자열을 일치시키려고 합니다.
print
int
이 예에서 grep -F 'int'
or를 사용하면 grep -F "int"
일반적으로 -F 플래그와 함께 "고정" 문자열이 생성됩니다.
int
하지만 이 예에서는 두 문자열을 모두 일치합니다(단지 with 라인을 일치시키는 대신 print
).
다른 많은 게시물에도 비슷한 목표/문제가 있는 것 같지만,해당 게시물에서 권장되는 -F 플래그가 작동하지 않는다는 것이 여기에 명확하게 명시되어 있습니다..
실제 고정 문자열을 일치시키기 위해 grep을 어떻게 사용할 수 있습니까?
답변1
-F
정규식 메타 문자와 같은 .
문자 해석을 끄고 *
대신 문자열 리터럴로 처리합니다. 패턴이 하위 문자열, 전체 단어 또는 전체 행과 일치하는지 여부에는 영향을 미치지 않습니다. 이를 위해서는 -w
또는 -x
플래그가 필요합니다.
-w, --word-regexp 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 specified. -x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
답변2
문제는 "print"라는 단어 끝에 "int"도 나타난다는 것입니다.
-F를 사용하여 문자열을 수정하면 정규식 검색이 비활성화될 수 있지만 고정된 문자열 "int"는 여전히 "print"라는 단어에 남아 있습니다.
해결책은 정규식 사용으로 돌아가서 "전체 단어" 검색을 위해 단어 경계도 필요하도록 지정하는 것일 수 있습니다.
echo -e 'int\nprint' | grep '\bint\b'
답변3
다음 중 하나를 시도해 보십시오.
echo -e 'int\nprint\print' |grep -P '(^|\s)\int(?=\s|$)'
echo 'int - print'|grep -E '(^|\s)int($|\s)'
echo 'int - print'|grep -Fw "int"