내 디렉토리 구조에 많은 파일이 있습니다. 정규식을 사용하여 이 파일에서 일부 문자열(예: 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
이름이 다음으로 끝나는 현재 디렉토리의 하위 디렉토리에 있는 모든 파일을 찾는 명령의 또 다른 형식이 있습니다 ..html
alder
find *alder/ -name '*.html' -exec grep -oh "http://[^'\"]*" {} +
보다 강력한 접근 방식
다른 유형의 잘못된 파일을 방지하기 위해 html
Cas는 공백이나 >
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