편집하다

편집하다

마침표로 끝나지 않는 파일을 디렉토리에서 검색하려고 합니다. 마침표/구두점 표시가 뒤따르지 않는 마지막 ASCII 문자로 파일 이름을 나열하려고 합니다. 나는 모든 것을 살펴 보았지만 지금까지 아무것도 작동하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다!

for file in ./dir/*;
do grep -o '[^[:punct:]]$' $file

산출:

filename  f
filename  d
filename  e

파일 이름 뒤의 문자는 구두점이 아닌 파일의 마지막 문자를 나타냅니다.

빈 파일은 구두점으로 끝나지 않는 파일과 다르게 처리되어야 합니다. 빈 파일은 무시됩니다. 파일 이름을 무시하고 파일 내의 마침표/구두점을 구체적으로 언급하고 있습니다.

mawk 버전 1.3.4를 사용해야 합니다.

답변1

이는 아마도 GNU awk를 사용하여 수행하려는 작업일 것입니다 ENDFILE.

awk 'ENDFILE {
    if ( FNR ) {
        c = substr($0,length(),1)
        if ( c !~ /[[:punct:]]/ ) {
            print FILENAME, c
        }
    }
}' dir/*

또는 POSIX awk를 사용하십시오.

awk '
    FNR == 1 { prt(); fname=FILENAME }
    { lastRec = $0 }
    END { prt() }
    function prt(    c) {
        c = substr(lastRec,length(),1)
        if ( c !~ /[[:punct:]]/ ) {
            print fname, c
        }
    }
' dir/*

또는 awk가 POSIX가 아닌 경우(현재 가지고 있는 mawk 1과 같은) 다른 awk에서 작동하도록 하려면 구두점 [[:punct:]]문자(문자, 숫자 이외의 문자), 제어 문자의 하드코딩된 목록이 포함된 대괄호 표현식으로 바꾸십시오. 또는 공백 문자) 등을 사용하거나 구두점 문자(문자, 숫자, 제어 문자 또는 공백 문자가 아닌 문자)가 아닌 문자 목록(예: to 및 to)으로 비교 를 [-.,!=+]변경합니다.!~~[[:punct:]][a-zA-Z0-9 \t]

답변2

이는 파일 목록을 별도의 파일로 처리하는 옵션과 F파일 이름을 인쇄하는 명령과 함께 GNU sed를 사용하여 수행할 수 있습니다.

$ sed -sn '${s/.*\(.\)$/\1/;/[^[:punct:]]/{F;l}}' ./*

./fileone
a$

./filetwo
s$

이러한 파일은 모두 텍스트 파일이라고 가정합니다. 그렇지 않으면 여러 문자가 인쇄될 수 있습니다. 이 l명령은 콘솔의 원시 바이너리 출력 문제를 방지하는 데 사용됩니다.

설명하다

첫 번째 줄은 $마지막 줄과만 일치합니다. 이 줄에서 외부를 실행하십시오 {...}.

s/.*\(.\)$/\1/전체 줄을 마지막 문자로 바꿉니다 . 하나 이상의 문자가 있는 줄에 있습니다. 빈 줄은 변경되지 않습니다.

punct그런 다음 두 번째 중괄호 쌍의 내용이 ( ) 없는 /[^[:punct:]]/줄에서 실행됩니다 {...}. 물론 이를 위해서는 빈 줄을 거부하는 최소한 하나의 문자가 일치해야 합니다.

마지막 줄이 없는 곳에서 실행되는 코드는 파일 이름을 인쇄하고 punct줄 의 마지막 문자 값을 인쇄합니다(ascii가 아닌 경우 인코딩됨).Fl

편집하다

바이너리를 피하는 더 엄격한 버전은 다음과 같습니다.

sed -sn '${/[[:print:]\t]$/!d;s/.*\(.\)$/\1/;/[^[:punct:]]/{F;l}}' ./*

마지막 문자 print(모든 숫자, 문자(대소문자), 구두점 및 공백) 또는 탭 문자가 존재하지 않는 파일은 처리하지 않습니다.

답변3

끝에 구두점 없이 파일 내용을 찾아야 하는 경우:

for f in ./* ; do tail -n 1 "$f" | grep -qv '[^[:punct:]]$' || echo "$f" ; done

끝에 구두점 없이 파일 이름을 찾아야 하는 경우:

find . | grep -v '[[:punct:]]$'

관련 정보