이라는 파일이 있습니다 file.txt
. 이 파일에는 대문자와 소문자로 이루어진 단어도 있고, 대문자와 소문자, 숫자로 이루어진 단어도 있습니다. 출력에 다음을 포함하는 단어가 포함되지 않도록 이 파일을 필터링하고 싶습니다.둘 다대문자와 소문자. 예를 들어 다음을 입력합니다 file.txt
.
Aaa
aBb
aB
Aa12
12aA
123
123Ab
AAA
aaa
파일에 대문자와 소문자를 포함하는 단어(예: Aaa, aBp)가 있고 해당 단어에 대문자와 소문자가 포함되어 있습니다.그리고번호(예: 123Ab). 또한 단어에는 소문자(예: aaa) 또는 대문자(예: AAA)만 포함됩니다. upper가 포함된 단어만 삭제하고 싶습니다.그리고소문자(예: Aaa, aBp)이므로 출력은 다음과 같습니다.
Aa12
12aA
123
123Ab
AAA
aaa
어떤 아이디어가 있나요?
답변1
grep -Exv '[A-Za-z]*([A-Z][a-z]|[a-z][A-Z])[A-Za-z]*'
설명하다
- 아이디어는 먼저 원하는 것과 반대되는 줄, 즉 대문자와 소문자만 포함하는 줄을 일치시키는 것입니다. 이는
grep -Ex
전체 줄과 일치하는 확장 정규 표현식과 함께 grep을 사용합니다. 그런 다음 이-v
플래그는 정규 표현식을 무효화합니다. 즉, 다음을 반환합니다.원하지 않는다다음 정규식을 일치시키세요. - 중앙 부분은
([A-Z][a-z]|[a-z][A-Z])
대문자와 소문자, 그 반대의 문자와 일치합니다. - 바깥쪽 부분은
[A-Za-z]*...[A-Za-z]*
줄의 나머지 부분에 대문자 또는 소문자만 포함되어야 함을 의미합니다.
답변2
한 줄에 하나의 단어를 가정합니다 grep
.
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
텍스트에서 일치하는 모든 단어를 보고하려면 한 줄에 여러 단어가 있을 수 있으며 단어는 단어가 아닌 문자로 구분됩니다.
<text tr -cs '[:alnum:][:digit:]_' '[\n*]' |
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
tr
GNU가 tr
만족할 수 없는 POSIX 호환 구현이 필요하다는 점에 유의하세요 . GNU 시스템에서는 다음을 사용할 수 있습니다 sed
.
<text sed -E 's/\W+/\n/g' |
grep -E '[[:digit:]]|^([[:lower:]]+|[[:upper:]]+)$'
답변3
귀하의 요청을 반복하려면 다음이 필요합니다.유지하다한마디로 말하면:
- 그것은
숫자편지가 아니거나 - 모두 대문자, 또는
- 모두 소문자입니다
그 다음에
awk '/[^[:alpha:]]/ || /^[[:upper:]]+$/ || /^[[:lower:]]+$/' file
답변4
사용 sed
:
$ sed -E -e '/[0-9]/b' -e '/^[A-Z]+$/b' -e '/^[a-z]+$/b' -e 'd' <file
Aa12
12aA
123
123Ab
AAA
aaa
주석이 달린 sed
스크립트:
/[0-9]/b # Digits are present, branch to end
/^[A-Z]+$/b # Only uppercase characters present, branch to end
/^[a-z]+$/b # Only lowercase characters present, branch to end
d # Delete line, start next cycle
# (at end, implicit print)
또는,
sed -E -e '/[[:digit:]]/b' -e '/^[[:upper:]]+$/b' -e '/^[[:lower:]]+$/b' -e 'd' <file
sed
로케일에 따라 이 스크립트와 첫 번째 스크립트 사이에 차이가 있을 수 있습니다.