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
시작과 끝 모두에서 일치합니다. 원래 \<
및 편집기 에서 상속 되었으며 .\>
ex
vi
\b
GNU는 단어의 시작이나 끝에서 and ( and 와 동일하게 작동 ) 일치를 grep
지원하지 않지만 BSD는 지원합니다. BSD에서는 지원되지 않습니다 .[[:<:]]
[[:>:]]
\<
\>
grep
grep
\b
답변2
Grep with -e
(표현식 뒤에 오는 의미)는 기본적으로 기본 정규식을 사용합니다. 에서 man grep
"기본 정규식과 확장 정규식" 아래(온라인 매뉴얼):
레거시에서는 메타 문자를
egrep
지원하지 않지만{
일부 egrep 구현에서는 지원하므로 이식 가능한 스크립트는 패턴 사용을\{
피하고 대신 리터럴 일치에 사용해야 합니다 .{
grep -E
[{]
{
GNU grep은 유효하지 않은 간격 지정의 시작이라고
-E
가정하여 전통적인 사용법을 지원하려고 시도하지만 이는 특별하지 않습니다.{
예를 들어, 이 명령은 정규식의 구문 오류를 보고하는 대신grep -E '{1'
두 문자로 된 문자열을 검색합니다 .{1
POSIX는 이 동작을 확장으로 허용하지만 이식 가능한 스크립트에서는 이를 피해야 합니다.
따라서 가장 이식성이 뛰어난 옵션은 다음과 같습니다.
grep -rnw -e 'flag[{]' 'Downloads/' | more
답변3
echo 'flag{' | grep -F 'flag{'
flag{
echo 'flag{' | grep 'flag{'
flag{
echo 'flag{' | grep -E 'flag{'
flag{