내가 읽고 있는 디렉토리에 책 목록이 있는데, 책에서 특정 문자의 소문자와 대문자로 끝나는 모든 단어를 나열하고 싶습니다.
아마도 cut이나 tr을 사용하여 이를 수행할 수 있는 방법이 있을 것입니다. 그러나 나는 그것을 알아낼 수 없습니다. 파이프 내부에서 glob을 사용하여 이를 달성할 수 있는 방법이 있습니까?
grep, sed, awk 또는 perl을 사용할 수 없습니다.
편집: 내가 얻은 가장 가까운 것은 다음과 같습니다.
cat * | tr '[:punct:]' ' '| tr ' ' '\n' | tr -s '\n'| tr '[:upper:]' '[:lower:]' | rev | sort
이렇게 하면 한 줄에 하나씩 모든 단어 목록을 얻을 수 있습니다. 실제로 중복 항목을 제거할 필요는 없습니다. 이제 q로 시작하는 단어만 필터링하면 됩니다.
답변1
다음을 수행할 수 있습니다.
< book.txt \
tr -sc '[:alnum:]_-' '[\n*]' |
tr -d - |
rev |
cut -c1 |
tr -cd eE |
fold -w1 |
sort |
uniq -c
단어 끝에서 e
s 및 s(여기서는 영숫자, 밑줄 또는 하이픈의 시퀀스로 정의됨)를 계산하지만 몇 가지 제한 사항에 유의하세요.E
- 많은 구현(GNU 구현 포함)은 단일 바이트 문자로만 작동합니다.
rev
, 하지만 common은 표준 명령이 아닙니다.USA
U.S.A.
한 단어와 세 단어 가 될 것입니다 .- 구현에서 문자를 올바르게 처리하더라도 분해된 형식(급음 악센트를 결합한 U+0301이 뒤따름)으로 작성된 경우 2초로 계산됩니다
e
.Stéphane
é
e
- 하이픈을 처리하지 않습니다.
e
1.02e+23 또는 0xffe.5fp-4로 계산됩니다...
POSIX 셸 및 유틸리티로 제한된 경우 다음을 사용할 수도 있습니다 ed
.
ed -s book.txt << 'EOF' | sort | uniq -c
g/[^[:alnum:]_-]\{1,\}/s//\
/g
g/-/s///g
g/.*\(.\)$/s//\1/
v/[eE]$/d
,p
Q
EOF
또는 다음을 사용하여 sh
:
l=0 u=0
< book.txt \
tr -sc '[:alnum:]_-' '[\n*]' | {
while IFS= read -r word; do
word=${word%"${word##*[!-]}"}
case $word in
(*e) l=$((l + 1));;
(*E) u=$((u + 1));;
esac
done
printf '%s\t%s\n' "$l" e "$u" E
}