다음 형식의 여러 링크가 포함된 파일이 여러 개 있습니다.
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
<img ... />
</a>
다를 수 FOO
있으니 참고하시기 바랍니다 .BAR
FNORD
이제 이러한 모든 파일에 올바른 속성이 설정되어 있는지 확인하고 싶습니다. 이를 위해 ack-grep과 cut을 사용하고 싶습니다.
ack-grep -a ?parameter= *.txt
출력을 얻으십시오 :
fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">
그러나 나는 출력을 줄여서 다음만 볼 수 있도록 하는 방법을 전혀 모릅니다.
fileName.txt
parameter=FOO-_-BAR-_-FNORD
fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA
답변1
--output EXPR
ack-grep에 인수를 사용하여 행의 일부만 선택적으로 인쇄할 수 있습니다 . ack-grep은 Perl 스크립트이고 EXPR 인수는 단지 Perl 표현식이라는 점을 기억하십시오. 이 경우 패턴 일치에서 ? 줄의 일부만 가져오기 위해 괄호를 사용하고 있습니다. 끝까지"(역시 정규식 메타 문자 '?'를 인용하기 위해 백슬래시를 사용했는데, 정규식의 첫 번째 문자로 작동할 수도 있지만 그렇게 하지 않았습니다).
ack-grep -a --output '$1' '\?(parameter=.*?)"'
마지막 것을 보셨나요? .* 정규식은 탐욕스럽지 않으므로 줄의 마지막 대신 첫 번째 "와 일치합니다.
그러면 다음과 같은 출력 라인이 생성됩니다. ack-grep에 대한 인수를 사용하여 선행 1을 억제할 수 있습니다 1:parameter=FOO-_-BAR-_-FNORD
.-h
답변2
ack-grep
Mac에 유틸리티가 없는데 이 awk
솔루션이 도움이 될까요?
awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' INPUT_FILE
구현하다:
[jaypal:~/Temp] cat file0
<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
<img ... />
</a>
[jaypal:~/Temp] awk -v FS=[?\"] '/param/{print FILENAME; print $3 }' file0
file0
parameter=FOO-_-BAR-_-FNORD
귀하에게 적합한 솔루션:
파일 이름과 매개변수 값을 가져오는 것이 중요한 경우 간단한 명령으로 실행하거나 현재 가져온 출력을 파일로 리디렉션하거나 아래 코드 한 줄로 for loop
파이프할 수 있습니다 .awk
간단한 for 루프:
[jaypal:~/Temp] for i in ./file*.txt; do awk -v FS=[?\"] '/param/{print FILENAME; print $3"\n" }' "$i"; done
./file01.txt
parameter=FOO-_-BAR-_-FNORD
./file02.txt
parameter=POIT-_-NARF-_-BAZINGA
현재 출력을 파일로 리디렉션하고 호출합니다 awk
.
다음 예에서는 redirection
현재 다음 디렉터리에 출력하고 있다고 가정합니다.임시 파일.
[jaypal:~/Temp] cat temp.file
fileName.txt
1:<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">
fileName2.txt
5:<a href="http://example.com/fnord.layername.html?parameter=POIT-_-NARF-_-BAZINGA" class="poit">
[jaypal:~/Temp] awk -v FS=[?\"] 'NF==1{ print $0 }/param/{ print $3"\n" }' temp.file
fileName.txt
parameter=FOO-_-BAR-_-FNORD
fileName2.txt
parameter=POIT-_-NARF-_-BAZINGA
답변3
제가 이해하고 있는지 잘 모르겠고 ack-grep 유틸리티에 익숙하지도 않습니다. 하지만 처음 발생하는 부분부터 잘라내어 보는 것은 어떨까요? 도착하다"?
이와 같이:
가독성을 위해 html 태그를 변수에 넣었습니다.
var='<a href="http://example.com/fnord.layername.html?parameter=FOO-_-BAR-_-FNORD" class="poit">'
cut -d '?' -f 2- <(echo $var ) | cut -d '"' -f 1