마침표로 끝나지 않는 파일을 디렉토리에서 검색하려고 합니다. 마침표/구두점 표시가 뒤따르지 않는 마지막 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가 아닌 경우 인코딩됨).F
l
편집하다
바이너리를 피하는 더 엄격한 버전은 다음과 같습니다.
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:]]$'