나는 파일의 첫 번째 줄이 특정 패턴과 일치하는지 확인하고 일치하면 파일을 인쇄하려는 스크립트를 작성 중입니다. 이 목표를 어떻게 달성할 수 있나요?
스키마를 확인하는 방법은 무엇입니까? 패턴을 확인하고 출력에 따라 뭔가를 할 수 있는 방법이 있나요..
편집: 이 질문을 살펴보십시오.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
txt
pattern
첫 번째 줄이 확장 정규 표현식과 일치하는 현재 디렉터리의 숨겨지지 않은 파일 이름을 인쇄합니다.지원 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도 작은 작업으로 쉽게 관리할 수 있어야 합니다.