내 디렉토리에 "="로 시작하는 줄이 포함된 .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;
노트
find
그리고xargs
여기서는 필요하지 않습니다. 이-r
옵션을 사용하면grep
하위 디렉터리를 반복적으로 검색할 수 있습니다.--include '*.txt'
grep
glob 과 일치하는 파일을 제한합니다*.txt
.^
줄의 시작 부분과 일치합니다.[[:space:]]*
0개 이상의 공백 문자와 일치합니다.=
등호와 일치합니다. POSIX 정규식에서는 특별한 내용이 없으므로=
다른 문자처럼 처리할 수 있습니다.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
반면, 첫 번째 예에서와 같이 사용하면 ;
한 번에 하나의 파일만 제공됩니다.