sed는 빈 파일에 대해 명령을 실행할 수 있습니다(종료 명령).

sed는 빈 파일에 대해 명령을 실행할 수 있습니다(종료 명령).

파일 내용을 확인하려는 쉘 스크립트가 있습니다.

예상되는 콘텐츠에는 구체적인 첫 번째 줄이 있어야 합니다. 예 ^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

하지만 빈 입력으로 테스트했는데 sed1 대신 0이 반환되었습니다.

echo -ne '' | sed -rn '/^MYFIRSTROW/q0; 1q1'; echo $?
# 0

그리고 이 경우에는 주소 "0"을 사용하는 방법을 찾지 못했습니다.

GNU sed에서 하나의 명령으로 이를 수행할 수 있는 방법이 있습니까?

참고: 대체 솔루션

나는 주로 빈 입력에 대해 sed 명령을 실행할 수 있는지, 그리고 어떻게 실행할 수 있는지에 대해 대답하고 싶지만 내 우아한 쉘 스크립트에 대한 제안은 환영합니다.

  • 나는 느리지만 이것이 if [ -s "myfile" ] && sed ...일을 끝낼 수 있다는 것을 깨달았습니다.

  • while read < myfile솔루션을 사용하는 것을 상상할 수 있지만 번거로운 것 같습니다.

  • awkEND 블록이 항상 실행되는 반대 문제가 있었기 때문에 이 코드는 항상 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

ENDAWK를 사용하면 설정할 종료 코드를 블록에 알려주는 변수를 설정할 수 있습니다 . 여기서는 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

관련 정보