첫 번째 줄이 특정 패턴과 일치하는 경우에만 파일 내용을 인쇄하는 방법은 무엇입니까?

첫 번째 줄이 특정 패턴과 일치하는 경우에만 파일 내용을 인쇄하는 방법은 무엇입니까?

나는 파일의 첫 번째 줄이 특정 패턴과 일치하는지 확인하고 일치하면 파일을 인쇄하려는 스크립트를 작성 중입니다. 이 목표를 어떻게 달성할 수 있나요?

스키마를 확인하는 방법은 무엇입니까? 패턴을 확인하고 출력에 따라 뭔가를 할 수 있는 방법이 있나요..

편집: 이 질문을 살펴보십시오.https://stackoverflow.com/questions/5536018/how-to-get-match-regex-pattern-using-awk-from-file

나는 이런 것을 원하지만 그 중 누구도 나에게 적합하지 않습니다. 기본적으로 첫 번째 줄이 정규식 패턴과 일치하는지 확인하고 이를 기반으로 파일 줄을 인쇄하고 싶습니다.

답변1

당신은 이것을 할 수 있습니다 ed:

ed -s infile <<\IN 2>/dev/null
1s/PATTERN/&/
,p
q
IN

여기서의 비결은 PATTERN온라인으로 자신을 대체하는 것입니다 1st. ed지정한 패턴이 없으면 에러가 발생하므로 (파일 전체 인쇄) ,p성공할 경우에만 실행됩니다.1s/PATTERN/&/

또는 다음을 사용하여 sed:

sed -n '1{
/PATTERN/!q
}
p' infile

q첫 번째 줄이 !( ) 와 일치 하지 않으면 PATTERN이 작업이 수행되고 , 그렇지 않으면 p모든 줄이 인쇄됩니다.
아니면 지적한 대로토비 스페이트, GNU 사용 sed:

sed '1{/PATTERN/!Q}' infile

Q와 동일 q하지만 패턴 공간을 인쇄하지 않습니다.

답변2

POSIX 도구 상자 사용:

{ head -n 1 | grep pattern && cat; } <file

답변3

 awk '/pattern/{print FILENAME}; {nextfile}' ./*.txt

txtpattern첫 번째 줄이 확장 정규 표현식과 일치하는 현재 디렉터리의 숨겨지지 않은 파일 이름을 인쇄합니다.지원 awk되는 구현nextfile.

파일 이름을 인쇄하는 대신 전체 파일 내용을 인쇄하려면 다음을 수행할 수 있습니다.

 awk 'FNR == 1 && ! /pattern/ {nextfile}; {print}' ./*.txt

이는 단일 명령만 실행하기 때문에 작동하지만 awk파일 내용을 덤프하는 데 가장 효율적인 명령은 아닙니다. 다음을 수행하면 더 나은 성능을 얻을 수 있습니다.

 awk '/pattern/{printf "%s\0", FILENAME}; {nextfile}' ./*.txt |
   xargs -r0 cat

즉, awk일치하는(0으로 구분된) 파일 목록을 인쇄하고 cat해당 내용을 덤프하는 데 의존합니다.

답변4

구식에서는 문장을 표준 명령으로 번역하세요.

for file in *; do
    if head -n 1 "${file}" | grep -q 'PATTERN'; then
        cat "${file}"
    fi
done

이것은 bash를 배우기 위한 좋은 시작입니다. 빠른 해결 방법이 필요한 경우 sed, awk 또는 perl 답변을 사용해 보세요. 둘 다 괜찮지만, 배워야 할(아마도) 자신만의 언어입니다.

이는 매우 간단한 예이므로 더 자세히 알고 싶다면 Ruby, PHP, js(예: Nodejs) 또는 파일 액세스를 허용하는 다른 언어에서 동일한 내용을 시도해 볼 수도 있습니다. C/C++나 Java도 작은 작업으로 쉽게 관리할 수 있어야 합니다.

관련 정보