파일 내용을 확인하려는 쉘 스크립트가 있습니다.
예상되는 콘텐츠에는 구체적인 첫 번째 줄이 있어야 합니다. 예 ^MYFIRSTROW
:그리고비워둘 수 없습니다.
그래서 저는 GNU를 사용하여 이 검사를 작성했습니다 sed
.
#!/bin/bash
# "1q1": return 1 on input line 1. Only reached if the pattern did not match.
if sed -rn '/^MYFIRSTROW/q0; 1q1' myfile; then
# ...
fi
하지만 빈 입력으로 테스트했는데 sed
1 대신 0이 반환되었습니다.
echo -ne '' | sed -rn '/^MYFIRSTROW/q0; 1q1'; echo $?
# 0
그리고 이 경우에는 주소 "0"을 사용하는 방법을 찾지 못했습니다.
GNU sed에서 하나의 명령으로 이를 수행할 수 있는 방법이 있습니까?
참고: 대체 솔루션
나는 주로 빈 입력에 대해 sed 명령을 실행할 수 있는지, 그리고 어떻게 실행할 수 있는지에 대해 대답하고 싶지만 내 우아한 쉘 스크립트에 대한 제안은 환영합니다.
나는 느리지만 이것이
if [ -s "myfile" ] && sed ...
일을 끝낼 수 있다는 것을 깨달았습니다.while read < myfile
솔루션을 사용하는 것을 상상할 수 있지만 번거로운 것 같습니다.awk
END 블록이 항상 실행되는 반대 문제가 있었기 때문에 이 코드는 항상 1을 반환했습니다.awk 'NR==1 && /^MYPATTERN/ {exit 0}END{exit 1}' myfile
추신: 죄송합니다. 제 질문이 코드 골프 요청과 너무 비슷해 보일 수도 있지만, 제 스크립트에서 간결하고 효율적인 파일 내용 확인을 원합니다.
답변1
주요 대답은 다음과 같습니다. 아니요. sed
해당 스크립트는 각 라인마다 실행되므로 라인이 없으면 명령을 실행할 수 없습니다.
해결 방법: 지금 쉘에 행을 추가하도록 하십시오.
sed -n '/^MYPATTERN/q;$q1;2q2' <(echo) yourfile
<(echo)
빈 줄이 하나만 있는 파일인 척 하므로 sed
해당 스크립트가 항상 실행됩니다. 비어 있으면 yourfile
첫 번째 행이 마지막 행이기도 하므로 $q1
상태 1로 종료됩니다.
그렇지 않으면 스크립트는 의 첫 번째 줄에서 실행됩니다 yourfile
. 일치하는 것이 있으면 상태 코드 0으로 종료합니다.
일치하는 항목이 없으면 sed
존재하며 상태는 2입니다. 추가된 라인 파일의 첫 번째 라인은 라인 2로 나타납니다 sed
.
ksh 스타일 프로세스 교체를 지원하지 않고 쉘에 대해 동일한 기능을 달성하는 방법에 대한 팁을 제공한 Stéphane Chazelas에게 감사드립니다.
echo|sed -n '/^MYPATTERN/q;$q1;2q2' - yourfile
as -
매개변수는 파이프에서 전송된 빈 줄인 stdin을 나타냅니다 echo
.
답변2
END
AWK를 사용하면 설정할 종료 코드를 블록에 알려주는 변수를 설정할 수 있습니다 . 여기서는 ok
명시적으로 할당하지 않으면 0이라는 점을 남용합니다. (또는 BEGIN { ok=0 }
노골적인 내용을 추가하세요.)
awk 'NR==1 && /^MYPATTERN/ {ok=1; exit} NR==2 {exit} END {exit !ok}' myfile
이것은 의도적인 것이며 골프를 쳤을 가능성이 높습니다. 왜냐하면 우리는 첫 번째 행의 패턴만 찾고 있기 때문입니다.
sed에서 간단한 방법으로 이 작업을 수행하는 방법을 모르겠습니다. 이를 반대로 하고 표시되면 1로 종료할 수 있지만 MYPATTERN
빈 파일의 경우 0으로 종료해야 합니다. 그런 다음 주변의 감각을 반전시켜야 합니다 if
.
if ! sed -Ene '/^MYPATTERN/q1; 1q0' myfile; then
echo "MYPATTERN seen..."
fi
sed가 읽을 수 없는 것과 같은 실제 오류를 반환하더라도 이는 기본 분기 로 이동 if
(및 인쇄 ) 됩니다 .MYPATTERN seen...
myfile