bash 스크립트에서 sed 또는 grep을 사용하여 파일이 특정 문자열로 끝나는지 확인하세요.

bash 스크립트에서 sed 또는 grep을 사용하여 파일이 특정 문자열로 끝나는지 확인하세요.

내 우분투 서버에 output.txt라는 파일이 있습니다. sed 또는 grep을 사용하여 파일의 마지막 두 문자가 "nt"인지 어떻게 확인할 수 있습니까? 파일의 텍스트는 다음과 같습니다. if 문이 반환되기를 원합니다. 이런 상황에서는 사실입니다.

상원은 9월까지 연방정부 일부에 자금을 지원하기 위한 6개 법안 패키지를 통과시켜 부분적인 정부 폐쇄를 가까스로 피했습니다.

상원은 법안을 75대 22로 통과시켜 자정 마감일을 앞두고 바이든 대통령 책상으로 법안을 보냈다.

바이든 씨는 토요일에 법안에 서명할 것으로 예상됩니다.

공화당은 이민 관련 조치와 기타 조치에 대한 수정안 표결을 요구해 법안 통과를 지연시켰고 자금이 소진된 후 토요일까지 최종 표결을 연기하겠다고 위협했습니다.

척 슈머 민주당 상원 원내대표는 표결에 앞서 "우리나라에 좋은 소식이 있다"고 말했다.

“우리는 모자, 퇴역군인, 환경, 주택 등을 위한 중요한 프로그램에 계속해서 자금을 지원할 것입니다. 오늘의 파트너십의 결과로 우리는 정부에 전액 자금을 지원한다는 목표를 향해 큰 진전을 이루었습니다.

답변1

sed나는 정말로 or here 를 사용하지 않을 것입니다 grep. 할 수 있지만 제 생각에는 tail더 쉽습니다. 파일의 마지막 3바이트를 가져오는 데 사용됩니다 tail(후행 문자를 설명하려면 3바이트가 필요함)(각 문자가 1바이트를 초과할 수 있는 더 복잡한 유니코드 문자열을 찾는 경우에는 \n작동하지 않음 nt). 일치하는 항목이 있는지 확인하세요 nt.

if [ "$(tail -c3 file)" = "nt" ]; then 
  echo yes
else
  echo no
fi

grep예를 들어 전체 파일(NUL 문자가 포함되어 있지 않다고 가정)을 단일 "줄"로 처리하고 마지막 문자를 확인하여 GNU를 사용하여 이 작업을 수행할 수 있습니다 .

if grep -qPz 'nt\n$' file; then
 echo yes
else
 echo no
fi

또는 sed더 좋고 간단하게 다음과 같은 것을 사용하십시오(또는 @steeldriverGNU 특정 방법):

if [ "$(sed -n '${/nt$/p;}' file | wc -c)" -gt 0 ]; then 
  echo yes; 
else 
  echo no
fi

심지어 perl:

if perl -ne '$l=$_; }{ exit($l=~/nt$/ ? 0 : 1)' file; then 
 echo yes
else
 echo no
fi

답변2

우분투에는 GNU sed가 있으므로uit 명령에는 상태 코드를 반환하는 확장이 있으므로 마지막 줄의 주소를 지정하고 nt예를 들어 상태 0 또는 0이 아닌 것으로 끝나는 경우 상태 0으로 종료할 수 있습니다.

 if sed -n '${/nt$/q0;q1}' output.txt; then ...

sed의 다른 가능한 상태와 구별하기 위해 0이 아닌 상태를 4보다 큰 값으로 설정할 수 있습니다.종료 상태.

답변3

사용행복하다(이전 Perl_6)

Raku는 Perl 계열의 프로그래밍 언어입니다. Raku에는 부울 TrueFalse(열거) 값이 있습니다. Bool일상적이거나 동등한 강제를 통해 so("그렇습니까?") 루틴은 필수 True/ False출력을 생성합니다.


후행 공백을 무시합니다.

파일 핸들(예: $fh.eof) 사용:

~$ raku -e 'my $fh = $*ARGFILES.IO.open;  \
            .match(/ nt \h* $/).Bool.say if $fh.eof for $fh.lines;'  file

사용 lines.tail:

~$ raku -e '.match(/ nt \h* $/).Bool.say for lines.tail;'  file

#OR:

~$ raku -e 'lines.tail.match(/ nt  \h* $/).Bool.put;'  file

더 간단하다 lines.tail:

~$ raku -e 'm/ nt \h* $/.so.put for lines.tail;'  file

후행 공백을 제거하거나 처리합니다.

Truent맨 위 섹션에 대한 답변은 마지막 줄이 로 끝나면 괜찮음을 반환하고, False그렇지 않으면 괜찮습니다. 그러나 False파일에 하나 이상의 후행 줄 바꿈만 포함되어 있으면 상단 섹션의 응답이 반환됩니다. 보다 정확한 부울 응답을 제공하기 위해 후행 공백을 다음과 같이 처리할 수 있습니다.

(단일) 터미널 줄 바꿈 문자와 그에 따른 후행 공백을 제거합니다.

~$ raku -e '.match(/ nt $/).Bool.say for lines.tail(2).chomp.trim-trailing;'  file

모든 후행 빈 줄을 제거합니다(pass slurp).

~$ raku -e '.match(/ nt $/).Bool.say for slurp.trim-trailing;'  file

후행 빈 줄 건너뛰기( lines및 를 통해 chars):

~$ raku -e 'my $fh = $*ARGFILES.IO.open;  \
             my $a = $_ if .chars for $fh.lines();  \
             $a.match(/ nt $/).Bool.say;'  file

#OR

~$ raku -e 'my $a = $_ if .chars for lines(); put $a ~~ m/ nt $/.so;'  file

https://docs.raku.org/type/Bool
https://docs.raku.org
https://raku.org

답변4

다음은 grep 및 sed를 사용하여 이를 수행하는 방법에 대한 매우 간단한 예입니다.

#!/usr/bin/bash

result=$(grep -o 'nt$' 'Output.txt' | sed '$!d')
if [ "$result" = 'nt' ]; then
   echo 'Matched !'
else
   echo 'Not found !'
fi

설명하다:

  • -o 일치하는 부분만 인쇄합니다.
  • $는 줄의 모든 끝과 일치합니다.
  • '$!d'는 마지막 줄을 제외한 모든 줄을 삭제합니다.

관련 정보