대문자와 소문자로 구성된 단어를 제거하시겠습니까?

대문자와 소문자로 구성된 단어를 제거하시겠습니까?

이라는 파일이 있습니다 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:]]+)$'

trGNU가 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로케일에 따라 이 스크립트와 첫 번째 스크립트 사이에 차이가 있을 수 있습니다.

관련 정보