여러 파일에서 find 및 sed를 사용하여 줄을 인쇄하는 방법은 무엇입니까?

여러 파일에서 find 및 sed를 사용하여 줄을 인쇄하는 방법은 무엇입니까?

디렉토리 구조에 많은 파일이 있습니다. 해당 파일에서 정규식을 사용하여 일부 문자열(즉, URL)을 추출하고 싶습니다.

나는 이것을 시도했습니다 :

find . -path "*alder/ * / * .html" -print | xargs sed -n "/http:\/\/[^'\"]*/p" > urls.txt

...하지만 예상대로 작동하지 않습니다. 그 find부분은 괜찮습니다. xargs하나는 괜찮습니다. 하지만 sed하나는 아닙니다. urls.txt에서 얻는 것은 모든 파일을 연결한 것뿐입니다.

답변1

동일한 find명령을 사용하면 정규식과 일치하는 URL이 반환됩니다.

find . -path "*alder/ * / * .html"  -exec grep -oh "http://[^'\"]*" {} +

와 달리 find...-print | xargs command...이 접근 방식은 이름에 공백이나 기타 어려운 문자가 포함된 파일에서 작동합니다.

옵션 -ogrep일치하는 행이 아닌 일치하는 부분만 반환하도록 지시합니다. -h일치하는 항목이 발견된 파일 이름의 인쇄를 생략하도록 지시합니다.

OP의 명령은 find이름에 경로에 공백이 있는 파일과만 일치합니다. 이것이 당신이 원하는 것이 아닐 것이라고 생각하기 때문에 여기에 이름이 다음으로 끝나는 현재 디렉토리의 하위 디렉토리 아래에 있는 find모든 파일을 찾는 명령 의 대체 형식이 있습니다 ..htmlalder

find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +

보다 강력한 접근 방식

다른 종류의 잘못된 파일을 방지하기 위해 htmlcas는 공백을 허용하거나 >URL의 끝을 알리고 다음을 허용할 것을 https제안 합니다 http.

find . -path "*alder/ * / * .html"  -exec grep -oEh "https?://[^'\"[:space:]>]*" {} +

답변2

모든 빠른 답변에 감사드립니다. 경로에 추가 공백이 있어서 죄송합니다. 공백을 제거하면 여기에 게시할 때 경로가 이상한 것으로 변합니다.

grep이 1.2gB, 25,000개 이상의 파일에서 정말 느리기 때문에 sed를 사용하고 싶었습니다.

나는 답을 찾았습니다. "'= chars로 파일을 잘라내는 첫 번째 sed 명령과 해당 행을 인쇄하는 두 번째 sed 명령은 다음과 같습니다.

찾다 . -path "*alder.com/ * / * .html" -print| xargs sed -r "s/[\"'=]/\n/g"| sed -n "/^http\s?:/p" > urls.txt

관련 정보