중괄호 "{"를 찾는 방법은 무엇입니까?

중괄호 "{"를 찾는 방법은 무엇입니까?

grep저는 Linux 시스템(Deb)에서 깃발 잡기 대회에서 깃발을 얻으 려고 합니다 . 다음은 결과를 반환하지 않습니다. flag{ }디렉터리에 수백 개의 텍스트 인스턴스가 있다는 것을 알고 있습니다 .

grep -rnw 'Downloads/' -e  'flag{' | more

왜? 어떻게 검색할 수 있나요 flag{? 아래는 잘 작동하지만.

grep -rnw 'Downloads/' -e  'flag' | more

답변1

를 사용하면 개행 문자(줄의 시작 또는 끝) 또는 단어가 아닌 문자(단어 문자는 문자, 숫자 또는 밑줄) 바로 앞이나 뒤의 일치 항목만 반환되도록 grep -w요청합니다 .grep

이는 텍스트에서 다음 문자가 단어 문자이기 때문에 텍스트가 '와 일치 this is flag{a}하지 않음 을 의미합니다.grep -w 'flag{{

마찬가지로 this is theflag{일치하지 않습니다 grep -w 'flag{'.

해당 옵션을 무시 -w하고 대신 너비가 0인 명시적인 단어 경계 패턴(예: 시작 부분)을 사용하여 일치는 가능 flag{a}하지만 일치하지 않을 수 있습니다 theflag{. GNU의 경우 grep다음을 사용하여 이를 수행할 수 있습니다.

grep -rn '\<flag{' Downloads

또는

grep -rn '\bflag{' Downloads

\<패턴은 단어 시작 부분의 단어 경계와 \>끝 부분의 경계를 일치시키고 \b시작과 끝 모두에서 일치합니다. 원래 \<및 편집기 에서 상속 되었으며 .\>exvi\b

GNU는 단어의 시작이나 끝에서 and ( and 와 동일하게 작동 ) 일치를 grep지원하지 않지만 BSD는 지원합니다. BSD에서는 지원되지 않습니다 .[[:<:]][[:>:]]\<\>grepgrep\b

답변2

Grep with -e(표현식 뒤에 오는 의미)는 기본적으로 기본 정규식을 사용합니다. 에서 man grep"기본 정규식과 확장 정규식" 아래(온라인 매뉴얼):

레거시에서는 메타 문자를 egrep 지원하지 않지만 {일부 egrep 구현에서는 지원하므로 이식 가능한 스크립트는 패턴 사용을 \{피하고 대신 리터럴 일치에 사용해야 합니다 .{grep -E[{]{

GNU grep은 유효하지 않은 간격 지정의 시작이라고 -E 가정하여 전통적인 사용법을 지원하려고 시도하지만 이는 특별하지 않습니다. {예를 들어, 이 명령은 정규식의 구문 오류를 보고하는 대신 grep -E '{1' 두 문자로 된 문자열을 검색합니다 . {1POSIX는 이 동작을 확장으로 허용하지만 이식 가능한 스크립트에서는 이를 피해야 합니다.

따라서 가장 이식성이 뛰어난 옵션은 다음과 같습니다.

grep -rnw -e 'flag[{]' 'Downloads/'  | more

답변3

echo 'flag{' | grep -F 'flag{'
    flag{

echo 'flag{' | grep 'flag{'
    flag{

echo 'flag{' | grep -E 'flag{'
    flag{

관련 정보