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