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...이 방법은 이름에 공백이나 기타 어려운 문자가 포함된 파일에 적용됩니다.

옵션은 일치하는 부분만 반환하고 일치하는 부분만 반환하도록 -o지시합니다 . 일치하는 항목이 발견된 파일 이름 인쇄를 무시하도록 지시합니다.grep-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

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

sed를 사용하여 grep을 처리하려고 하는데 1.2GB 및 25,000개 이상의 파일을 처리할 때 속도가 정말 느립니다.

나는 답을 찾았다. 첫 번째 sed 명령은 "'= chars를 사용하여 파일을 분할하고 두 번째 sed 명령은 해당 행을 인쇄합니다. 아래와 같이:

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

관련 정보