앗

bash 명령을 사용하여 줄에서 문자열과 숫자를 구분하는 방법.

예: 다음을 포함하는 예가 있습니다.

string123anotherstr456thenanotherstr789

출력은 다음과 같아야 합니다.

string
123
anotherstr
456
thenanotherstr
789

답변1

암소 비슷한 일종의 영양grep또는 호환 가능한 솔루션:

s="string123anotherstr456thenanotherstr789"
grep -Eo '[[:alpha:]]+|[0-9]+' <<<"$s"
  • [[:alpha:]]+|[0-9]+- 알파벳 문자 또는 숫자와 일치하는 교대 정규식 그룹은 출력에서 ​​별도의 항목으로 처리됩니다.

산출:

string
123
anotherstr
456
thenanotherstr
789

답변2

입력에는 문자와 숫자만 포함됩니다.

[[:alpha:]]+각각(문자 시퀀스) 및 각각 [[:digit:]]+(숫자 시퀀스) 뒤에 개행 문자를 추가합니다.

awk '{ gsub(/([[:alpha:]]+|[[:digit:]]+)/,"&\n",$0) ; printf $0 }' filename

( 일치 시퀀스 &의 약어입니다 awk.)


입력에 다른 문자(예: 구두점)가 포함되어 있습니다.

이전과 동일하지만 이제 [^[:alnum:]]+(비영숫자, 비숫자) 문자의 하위 문자열도 처리합니다.

awk '{ gsub(/([[:alpha:]]+|[[:digit:]]+|[^[:alnum:]]+)/,"&\n",$0) ; printf $0 }' filename

음수 및 소수

-(하이픈) 및 .(마침표)를 숫자로 처리합니다 .

awk '{ gsub(/([[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+)/,"&\n",$0) ; printf $0 }' filename

[[:digit:].-]+이러한 문자는 및 표현식 에 나타나야 합니다 [^[:alnum:].-]+. 또한 문자 그대로의 하이픈으로 해석되려면 다음과 -같아야 합니다.마지막각 표현식의 마지막 닫는 대괄호 앞의 문자는 그렇지 않은 경우를 의미합니다.범위성격.

예:

[test]$ cat file.txt 
string123another!!str456.001thenanotherstr-789

[test]$ awk '{ gsub(/([[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+)/,"&\n",$0) ; printf $0 }' file.txt 
string
123
another
!!
str
456.001
thenanotherstr
-789

독자를 위한 연습

입력 파일에 필요한 경우 awk명령을 다음과 같이 수정할 수 있습니다.

  • -에 있는 경우에만 확인하세요.시작일련의 숫자.
  • 과학적 표기법으로 된 숫자가 허용됩니다.

답변3

POSIX적으로:

string=string123anotherstr456thenanotherstr789
sed '
  s/[^[:alnum:]]//g; # remove anything other than letters and numbers
  s/[[:alpha:]]\{1,\}/&\
/g; # insert a newline after each sequence of letters
  s/[0-9]\{1,\}/&\
/g; # same for digits
  s/\n$//; # remove a trailing newline if any' << EOF
$string
EOF

답변4

python3

python3 -c '
from itertools import groupby
s = ("".join(g) for k, g in 
    groupby("string123anotherstr456thenanotherstr789", lambda x: x.isalpha()))
print(*s, sep="\n")
'

string
123
anotherstr
456
thenanotherstr
789

관련 정보