grep을 사용하여 특수 문자로 시작하는 줄을 일치시키는 방법은 무엇입니까?

grep을 사용하여 특수 문자로 시작하는 줄을 일치시키는 방법은 무엇입니까?

내 디렉토리에 "="로 시작하는 줄이 포함된 .txt 파일이 많이 있습니다.

예: a.txt에는 다음 줄이 있습니다(시작 부분에 공백 포함).

        =putSomething here;

위의 줄과 일치하는 grep 쿼리를 어떻게 작성할 수 있나요? 나는 다음을 시도했다.

find . -name "*.txt" | xargs grep -rn "^[=].*$"

답변1

이 예제 파일을 살펴보겠습니다.

$ cat file.txt
        =putSomething here;

.txt이제 현재 디렉토리에서 이러한 파일을 모두 찾으려면 다음을 수행하십시오.

$ grep -n '^[[:space:]]*=' *.txt
file.txt:1:        =putSomething here;

.txt현재 디렉토리에서 이러한 파일을 모두 찾고 싶다면모든 하위 디렉터리, 다음을 사용하십시오.

$ grep -rn '^[[:space:]]*=' --include '*.txt'
subdir/another.txt:1:        =putSomething here;
file.txt:1:        =putSomething here;

노트

  1. find그리고 xargs여기서는 필요하지 않습니다. 이 -r옵션을 사용하면 grep하위 디렉터리를 반복적으로 검색할 수 있습니다.

  2. --include '*.txt'grepglob 과 일치하는 파일을 제한합니다 *.txt.

  3. ^줄의 시작 부분과 일치합니다. [[:space:]]*0개 이상의 공백 문자와 일치합니다. =등호와 일치합니다. POSIX 정규식에서는 특별한 내용이 없으므로 =다른 문자처럼 처리할 수 있습니다.

  4. grep regex를 종료해도 .*$일치하는 행은 변경되지 않습니다. .*$뒤에 문자가 있거나 문자가 없으면 일치합니다. 사용해야 하는 유일한 이유 .*$는 grep이 강조 표시하는 일치하는 텍스트를 변경하는 것입니다.

답변2

로 시작하는 줄은 =정규식으로 변환됩니다 ^=.

찾기 명령은 다음과 같아야 합니다.

find . -name "*.txt" | xargs grep '^='

또는 더 나은 방법은 다음과 같습니다(쓸데없는 사용을 피하기 위해 xargs).

find . -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} +

(여기서 엔딩으로 인해 +여러 파일에 대해 하나의 grep만 수행되었습니다.)

답변3

아래 명령을 시도했는데 작동하는 것 같습니다.

grep -rn '^ *=' **/*txt

답변4

grep재귀 및 다음의 대안으로 xargs:

$ find /dir -type f -name "*.txt" -exec grep -q '^[[:space:]]*=' {} ';' -print

/dir이름이 주어진 패턴과 일치하는 (및 아래) 모든 일반 파일을 찾습니다 . 이러한 각 파일에 대해 grep -q '^[[:space:]]*='종료 상태가 0인 경우(패턴이 파일의 어딘가에 일치함) 해당 이름이 출력됩니다.

또는 라인 자체를 보고 싶다면 다음을 수행하십시오.

$ find /dir -type f -name "*.txt" -exec grep '^[[:space:]]*=' {} '+'

이렇게 하면 +각 호출에 대해 가능한 한 많은 파일 이름이 제공되는 grep반면, 첫 번째 예에서와 같이 사용하면 ;한 번에 하나의 파일만 제공됩니다.

관련 정보