특수 문자와 문자를 구분하는 bash 스크립트를 작성하고 싶습니까?

특수 문자와 문자를 구분하는 bash 스크립트를 작성하고 싶습니까?

저는 배쉬를 처음 접했습니다. "file.txt" 파일이 포함된 bash 스크립트를 작성하고 싶습니다.

일반 문자를 charecters.txt에 잘라내고 특수 문자를 Special.txt에 붙여넣고 싶습니다.

의사코드

#!/bin/bash
touch charecters.txt
touch specialcharecters.txt   
file='file.txt' 
i=1  
while read line; do  
if 
   # the letter is a charecter
then
  # cp that letter to charecters.txt
else
  cp that letter to alphabet.txt
fi
i=$((i+1))  
done < $file  

Bash/shell에서 이 작업을 어떻게 수행합니까?

답변1

특수 문자가 영숫자가 아닌 것을 의미한다고 가정합니까? 그렇다면 제가 생각해낸 것은 다음과 같습니다. 다음을 포함 하는 파일이 있습니다 test .

1234: 2271' 4423'
8901 1234 2569?
1234@ 5678! 9107:
1134 7896 6780

실행하면 cat test | tr -d '[:alnum:]' 다음과 같은 결과가 나타납니다.

: ' '
  ?
@ ! :

영숫자 기호를 일치시키려면 이 명령을 사용할 수 있습니다.

grep -o '[A-Za-z0-9]*' test

모든 행을 반복할 필요는 없다고 생각합니다.

답변2

GNU를 사용하면 awk다음을 수행할 수 있습니다.

gawk '
  BEGIN {
    n = split("alpha digit punct space", class)
    RS = ".{1}"; ORS = ""
  }
  {
    for (i = 1; i <= n; i++) if (RT ~ "^[[:" class[i] ":]]$") {
      print RT > (class[i] ".txt")
      next
    }
    print RT > "other.txt"
  }' < input.txt

현재 로캘에 속하는 것으로 간주되는 범주에 따라 문자를 alpha.txt, digit.txt, punct.txt, space.txt로 정렬합니다.other.txt

이름에도 불구하고 이 클래스는 alpha단지 알파벳 리터럴의 문자에 관한 것이 아닙니다. 여기에는 인간 언어의 단어를 구성하는 문자, 심지어 알파벳이 아닌 문자도 포함되는 경우가 많습니다. GNU 로케일에는 여러 숫자 체계의 숫자도 포함되어 있습니다(이 클래스와 일치하는 유일한 숫자인 영어 0123456789 제외 digit). 일부 다른 시스템에서는 digit다양한 숫자가 포함됩니다(비록소수번호 체계), alpha아니요. 어쨌든 + alnum입니다 . C 표준 및alphadigit곧 POSIX도, GNU 방법을 사용합니다.

답변3

완전성을 위해 여기에 문장이 있습니다.

cat file.txt  | tee  >(tr -d -C  '[:alpha:]'>char.txt) | tr -d '[:alpha:]'>specialchar.txt

이 예에서는 tee출력을 두 개의 서로 다른 프로세스에 복사합니다.

첫 번째는 tr알파벳이 아닌 문자를 제거한 다음(-C는 "보완"이거나 그 반대임) 해당 출력을 파일 이름에 쓰는 것입니다.

두 번째는 tr알파벳 문자를 제거하고 나머지는 다른 파일 이름으로 보냅니다.


본질적으로 이는 전체 프로세스를 두 번 실행하는 것과 같습니다.

cat filename | filter out nonalphas    > char.txt
cat filename | filter out alphas    > specialchar.txt

그러나 이는 두 개의 별도 명령이므로 입력이 변경되었을 수 있습니다.

관련 정보